diff --git a/graph/src/main/scala/tf/bug/fancadegraph/BlockDefinition.scala b/graph/src/main/scala/tf/bug/fancadegraph/BlockDefinition.scala index 4e629bc..eb635fd 100644 --- a/graph/src/main/scala/tf/bug/fancadegraph/BlockDefinition.scala +++ b/graph/src/main/scala/tf/bug/fancadegraph/BlockDefinition.scala @@ -1222,4 +1222,51 @@ object BlockDefinition { ) } + case object SetNumberReference extends BuiltIn[Unit] { + override val width: Int = 2 + override val height: Int = 1 + override val depth: Int = 2 + override val ids: Vector[Obj] = Vector( + Obj.setNumberReference0, + Obj.setNumberReference1, + Obj.setNumberReference2, + Obj.setNumberReference3 + ) + + val after: PinDefinition = + PinDefinition( + PinType.Pull, + PinDirection.Input, + PinPosition.top2(0) + ) + + val before: PinDefinition = + PinDefinition( + PinType.Pull, + PinDirection.Output, + PinPosition.bottom(0) + ) + + val reference: PinDefinition = + PinDefinition( + PinType.Pointer(PinType.Number), + PinDirection.Input, + PinPosition.left(1) + ) + + val value: PinDefinition = + PinDefinition( + PinType.Number, + PinDirection.Input, + PinPosition.left(0) + ) + + override val pins: Vector[PinDefinition] = Vector( + after, + before, + reference, + value + ) + } + } diff --git a/tagless/src/main/scala/tf/bug/fancadetagless/Fanscript.scala b/tagless/src/main/scala/tf/bug/fancadetagless/Fanscript.scala index 05db602..72c957c 100644 --- a/tagless/src/main/scala/tf/bug/fancadetagless/Fanscript.scala +++ b/tagless/src/main/scala/tf/bug/fancadetagless/Fanscript.scala @@ -61,6 +61,9 @@ trait Fanscript[F[_]] { def addNumbers(a: F[Float], b: F[Float]): F[Float] + def numberVariable(name: String): F[Float] + def setNumber(reference: F[Float], value: F[Float], after: () => F[Unit]): F[Unit] + def screenSizeWidth(screenSize: F[ScreenSize]): F[Float] def screenSizeHeight(screenSize: F[ScreenSize]): F[Float] @@ -201,6 +204,33 @@ object Fanscript { screenSize, Vector(1) )) + + override def numberVariable(name: String): Fancade[Float] = + Fix(FancadeF.Create( + Vector(), + Exists(Template( + BlockDefinition.GetNumber, + name + )), + Vector(), + Vector(BlockDefinition.GetNumber.output) + )) + override def setNumber(reference: Fancade[Float], value: Fancade[Float], after: () => Fancade[Unit]): Fancade[Unit] = { + val us = Fix(FancadeF.Create( + Vector(reference, value), + Exists(Template( + BlockDefinition.SetNumberReference, + () + )), + Vector(BlockDefinition.SetNumberReference.reference, BlockDefinition.SetNumberReference.value), + Vector(BlockDefinition.SetNumberReference.before) + )) + Fix(FancadeF.Sequence( + us, + BlockDefinition.SetNumberReference.after, + after() + )) + } override def positionPosition(position: Fancade[Position]): Fancade[Vector3] = ??? override def positionRotation(position: Fancade[Position]): Fancade[Rotation] = ??? diff --git a/tagless/src/main/scala/tf/bug/fancadetagless/Main.scala b/tagless/src/main/scala/tf/bug/fancadetagless/Main.scala index 8c9e162..d2e9faa 100644 --- a/tagless/src/main/scala/tf/bug/fancadetagless/Main.scala +++ b/tagless/src/main/scala/tf/bug/fancadetagless/Main.scala @@ -17,13 +17,12 @@ object Main extends IOApp { def program[F[_] : Sync : ContextShift]: Stream[F, Unit] = { val program = new Fanscript.Program[Unit] { override def run[G[_]](implicit interp: Fanscript[G]): G[Unit] = { - val screenSize = interp.screenSize - val screenWidth = interp.screenSizeWidth(screenSize) - val inspectWidth = interp.inspect(screenWidth, () => { - val screenHeight = interp.screenSizeHeight(screenSize) - interp.inspect(screenHeight, () => interp.unit) - }) - inspectWidth + val score = interp.numberVariable("Score") + val one = interp.lift(1.0F) + val addToScore = interp.addNumbers(score, one) + val setScore = interp.setNumber(score, addToScore, () => interp.unit) + val inspectScore = interp.inspect(score, () => setScore) + inspectScore } }