6502-opcodes/src/main/scala/com/htmlism/mos6502/dsl/Mapping.scala
2023-06-19 05:33:43 -04:00

74 lines
1.4 KiB
Scala

package com.htmlism.mos6502.dsl
import cats.data.NonEmptyList
/**
* Like an enum, but values are specified
*/
trait Mapping[A]:
def definitionGroupComment: String
/**
* An ordered list of every value in this enumeration
*/
def all: NonEmptyList[A]
def value(x: A): Int
/**
* ASM-safe label
*/
def label(x: A): String
/**
* Comment string
*/
def comment(x: A): String
object Mapping:
given mappingForBitField[A](using ev: BitField[A]): Mapping[A] =
new Mapping[A]:
private lazy val valueMap =
ev.all
.toList
.zip(List.iterate(1, ev.all.size)(_ << 1))
.toMap
def definitionGroupComment: String =
ev.definitionGroupComment
def all: NonEmptyList[A] =
ev.all
def value(x: A): Int =
valueMap(x)
def label(x: A): String =
ev.label(x)
def comment(x: A): String =
"" // TODO
given mappingForEnumAsm[A](using ev: EnumAsm[A]): Mapping[A] =
new Mapping[A]:
private lazy val valueMap =
ev.all
.toList
.zip(List.iterate(0, ev.all.size)(_ + 1))
.toMap
def definitionGroupComment: String =
ev.comment
def all: NonEmptyList[A] =
ev.all
def value(x: A): Int =
valueMap(x)
def label(x: A): String =
ev.label(x)
def comment(x: A): String =
ev.comment(x)