diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/AsmProgram.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/AsmProgram.scala
new file mode 100644
index 0000000..77d67f1
--- /dev/null
+++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/AsmProgram.scala
@@ -0,0 +1,22 @@
+package com.htmlism.scratchpad
+
+import cats.Semigroup
+import cats.syntax.all._
+
+case class AsmProgram[A : Reg, MA <: MutationStatus, Z : Semigroup](a: StatefulRegister[A, MA], z: Z):
+ def map(f: StatefulRegister[A, MA] => Z): AsmProgram[A, MA, Z] =
+ AsmProgram(a, z |+| f(a))
+
+ def widen[B : Reg]: AsmProgram2[A, MA, B, Unknown, Z] =
+ AsmProgram2(a, ??? : StatefulRegister[B, Unknown], z)
+
+case class AsmProgram2[A : Reg, MA <: MutationStatus, B : Reg, MB <: MutationStatus, Z : Semigroup](a: StatefulRegister[A, MA], b: StatefulRegister[B, MB], z: Z):
+ def map(f: (StatefulRegister[A, MA], StatefulRegister[B, MB]) => Z): AsmProgram2[A, MA, B, MB, Z] =
+ AsmProgram2(a, b, z |+| f(a, b))
+
+ def widen[C : Reg]: AsmProgram3[A, MA, B, MB, C, Unknown, Z] =
+ AsmProgram3(a, b, ??? : StatefulRegister[C, Unknown], z)
+
+case class AsmProgram3[A : Reg, MA <: MutationStatus, B : Reg, MB <: MutationStatus, C : Reg, MC <: MutationStatus, Z : Semigroup](a: StatefulRegister[A, MA], b: StatefulRegister[B, MB], c: StatefulRegister[C, MC], z: Z):
+ def map(f: (StatefulRegister[A, MA], StatefulRegister[B, MB], StatefulRegister[C, MC]) => Z): AsmProgram3[A, MA, B, MB, C, MC, Z] =
+ AsmProgram3(a, b, c, z |+| f(a, b, c))
diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/Generator.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/Generator.scala
new file mode 100644
index 0000000..e81657d
--- /dev/null
+++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/Generator.scala
@@ -0,0 +1,72 @@
+package com.htmlism.scratchpad
+
+object Generator extends App:
+ val allLetters =
+ ('A' to 'Z')
+ .map(_.toString)
+
+ for (n <- 1 to 22)
+ val classNum =
+ if (n == 1) "" else n
+
+ val letters =
+ allLetters.take(n)
+
+ val typeParametersLong =
+ letters.flatMap { s =>
+ List(s"$s : Reg", s"M$s <: MutationStatus")
+ }
+ .appended("Z : Semigroup")
+ .mkString(", ")
+
+ val typeParametersShort =
+ letters.flatMap { s =>
+ List(s"$s", s"M$s")
+ }
+ .mkString(", ")
+
+ val parameters =
+ letters.map { s =>
+ s"${s.toLowerCase}: StatefulRegister[$s, M$s]"
+ }
+ .appended("z: Z")
+ .mkString(", ")
+
+ val nPlus =
+ n + 1
+
+ val functionArgs =
+ val base =
+ letters.map { s =>
+ s"StatefulRegister[$s, M$s]"
+ }
+ .mkString(", ")
+
+ if (n == 1) base else s"($base)"
+
+ val arguments =
+ letters
+ .map(_.toLowerCase)
+ .mkString(", ")
+
+ val newLetter =
+ allLetters(n)
+
+ println(s"case class AsmProgram$classNum[$typeParametersLong]($parameters):")
+ println(s" def map(f: $functionArgs => Z): AsmProgram$classNum[$typeParametersShort, Z] =")
+ println(s" AsmProgram$classNum($arguments, z |+| f($arguments))")
+ println()
+ println(s" def widen[$newLetter : Reg]: AsmProgram$nPlus[$typeParametersShort, $newLetter, Unknown, Z] =")
+ println(s" AsmProgram$nPlus($arguments, ??? : StatefulRegister[$newLetter, Unknown], z)")
+ println()
+
+//case class AsmProgram[A : Reg, FA <: MutationStatus, Z : Semigroup](a: StatefulRegister[A, FA], z: Z):
+// def map(f: StatefulRegister[A, FA] => Z): AsmProgram[A, FA, Z] =
+// AsmProgram(a, z |+| f(a))
+//
+// def widen[B : Reg]: AsmProgram2[A, FA, B, Unknown, Z] =
+// AsmProgram2(a, ??? : StatefulRegister[B, Unknown], z)
+//
+//case class AsmProgram2[A : Reg, FA <: MutationStatus, B: Reg, FB <: MutationStatus, Z : Semigroup](a: StatefulRegister[A, FA], b: StatefulRegister[B, FB], z: Z):
+// def map(f: (StatefulRegister[A, FA], StatefulRegister[B, FB]) => Z): AsmProgram2[A, FA, B, FB, Z] =
+// AsmProgram2(a, b, z |+| f(a, b))
diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/ScratchPad.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/ScratchPad.scala
index 46a1e96..f478325 100644
--- a/scratchpad/src/main/scala/com/htmlism/scratchpad/ScratchPad.scala
+++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/ScratchPad.scala
@@ -22,17 +22,6 @@ class Reg[A]
object ScratchPad:
trait ReadWrite[A] extends Read[A] with Write[A]
- case class AsmProgram[A : Reg, FA <: MutationStatus, Z : Semigroup](a: StatefulRegister[A, FA], z: Z):
- def map(f: StatefulRegister[A, FA] => Z): AsmProgram[A, FA, Z] =
- AsmProgram(a, z |+| f(a))
-
- def widen[B : Reg]: AsmProgram2[A, FA, B, Unknown, Z] =
- AsmProgram2(a, ??? : StatefulRegister[B, Unknown], z)
-
- case class AsmProgram2[A : Reg, FA <: MutationStatus, B: Reg, FB <: MutationStatus, Z : Semigroup](a: StatefulRegister[A, FA], b: StatefulRegister[B, FB], z: Z):
- def map(f: (StatefulRegister[A, FA], StatefulRegister[B, FB]) => Z): AsmProgram2[A, FA, B, FB, Z] =
- AsmProgram2(a, b, z |+| f(a, b))
-
val startA =
??? : StatefulRegister[Accumulator, Unknown]