This commit is contained in:
Mark Canlas 2022-06-20 11:49:25 -04:00
parent c3559ccbee
commit eb97842353
4 changed files with 51 additions and 30 deletions

View File

@ -3,20 +3,34 @@ 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):
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] =
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):
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] =
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] =
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))

View File

@ -13,22 +13,25 @@ object Generator extends App:
allLetters.take(n)
val typeParametersLong =
letters.flatMap { s =>
List(s"$s : Reg", s"M$s <: MutationStatus")
}
.appended("Z : Monoid")
.mkString(", ")
letters
.flatMap { s =>
List(s"$s : Reg", s"M$s <: MutationStatus")
}
.appended("Z : Monoid")
.mkString(", ")
val typeParametersShort =
letters.flatMap { s =>
List(s"$s", s"M$s")
}
letters
.flatMap { s =>
List(s"$s", s"M$s")
}
.mkString(", ")
val parameters =
letters.map { s =>
s"${s.toLowerCase}: StatefulRegister[$s, M$s]"
}
letters
.map { s =>
s"${s.toLowerCase}: StatefulRegister[$s, M$s]"
}
.appended("z: Z")
.mkString(", ")
@ -37,10 +40,11 @@ object Generator extends App:
val functionArgs =
val base =
letters.map { s =>
s"StatefulRegister[$s, M$s]"
}
.mkString(", ")
letters
.map { s =>
s"StatefulRegister[$s, M$s]"
}
.mkString(", ")
if (n == 1) base else s"($base)"
@ -53,7 +57,9 @@ object Generator extends App:
allLetters(n)
println(s"case class AsmProgram$classNum[$typeParametersLong]($parameters):")
println(s" def andThen(that: AsmProgram$classNum[$typeParametersShort, Z]): AsmProgram$classNum[$typeParametersShort, Z] =")
println(
s" def andThen(that: AsmProgram$classNum[$typeParametersShort, Z]): AsmProgram$classNum[$typeParametersShort, Z] ="
)
println(s" AsmProgram$classNum($arguments, z |+| that.z)")
println()
println(s" def widen[$newLetter : Reg]: AsmProgram$nPlus[$typeParametersShort, $newLetter, Unknown, Z] =")
@ -63,5 +69,7 @@ object Generator extends App:
println(s" SubRoutine$classNum(s, this)")
println()
println(s"case class SubRoutine$classNum[$typeParametersLong](name: String, program: AsmProgram$classNum[$typeParametersShort, Z])")
println(
s"case class SubRoutine$classNum[$typeParametersLong](name: String, program: AsmProgram$classNum[$typeParametersShort, Z])"
)
println()

View File

@ -9,16 +9,16 @@ trait Read[A]
object Read:
implicit val readLease: Lease[Read] =
new Lease { }
new Lease {}
trait Write[A]
object Write:
implicit val writeLease: Lease[Write] =
new Lease { }
new Lease {}
object ScratchPad:
def reg[A : Reg]: PartialUsing[A] =
def reg[A: Reg]: PartialUsing[A] =
new PartialUsing[A]
class PartialUsing[A](using a: Reg[A]):
@ -41,10 +41,10 @@ object ScratchPad:
lazy val startY =
??? : StatefulRegister[RegisterY, Unknown]
(AsmProgram(startA, "") : AsmProgram[Accumulator, Unknown, String])
(AsmProgram(startA, ""): AsmProgram[Accumulator, Unknown, String])
(AsmProgram(startA, "")
.widen[RegisterX] : AsmProgram2[Accumulator, Unknown, RegisterX, Unknown, String])
.widen[RegisterX]: AsmProgram2[Accumulator, Unknown, RegisterX, Unknown, String])
//
// case class Subroutine2[A, B](name: String, f: (Lease[A], Lease[B]) => State2[A, B]) {

View File

@ -1,4 +1,3 @@
package com.htmlism.scratchpad
trait StatefulRegister[A : Reg, F <: MutationStatus]
trait StatefulRegister[A: Reg, F <: MutationStatus]