fancadescala/tagless/src/main/scala/tf/bug/fancadetagless/Fanscript.scala

172 lines
9.2 KiB
Scala

package tf.bug.fancadetagless
import higherkindness.droste.data._
import polymorphic._
import tf.bug.fancadetagless.Fanscript.{Position, ScreenSize}
import tf.bug.fancadescodec.Metadata.Sample
import tf.bug.fancadegraph.BlockDefinition
import tf.bug.fancadegraph.Template
trait Fanscript[F[_]] {
def lift(value: Float): F[Float]
def lift(value: Vector3): F[Vector3]
def lift(value: Rotation): F[Rotation]
def lift(value: Boolean): F[Boolean]
def win(stop: Boolean): F[Unit]
def lose(stop: Boolean): F[Unit]
def setScore(score: F[Float]): F[Unit]
def setCamera(position: F[Vector3], rotation: F[Rotation], distance: F[Float]): F[Unit]
def setLight(position: F[Vector3], rotation: F[Rotation]): F[Unit]
def screenSize: F[Fanscript.ScreenSize]
def accelerometer: F[Vector3]
def getPosition(obj: F[Obj]): F[Fanscript.Position]
def setPosition(obj: F[Obj], position: F[Vector3], rotation: F[Rotation]): F[Unit]
def raycast(from: F[Vector3], to: F[Vector3]): F[Fanscript.Raycast]
def getSize(obj: F[Obj]): F[Fanscript.Size]
def setVisible(obj: F[Obj], visible: F[Boolean]): F[Unit]
def createObj(original: F[Obj]): F[Obj]
def destroyObj(obj: F[Obj]): F[Obj]
def playSound(loop: Boolean, sound: Sample)(volume: F[Float], pitch: F[Float]): F[Float]
def stopSound(channel: F[Float]): F[Unit]
def volumePitch(channel: F[Float], volume: F[Float], pitch: F[Float]): F[Unit]
def addForce(obj: F[Obj], force: F[Vector3], applyAt: F[Vector3], torque: F[Vector3]): F[Unit]
def getVelocity(obj: F[Obj]): F[Fanscript.Velocity]
def setVelocity(obj: F[Obj], velocity: F[Vector3], spin: F[Vector3]): F[Unit]
def setLocked(obj: F[Obj], position: F[Vector3], rotation: F[Vector3]): F[Unit]
def setMass(obj: F[Obj], mass: F[Float]): F[Unit]
def setFriction(obj: F[Obj], friction: F[Float]): F[Unit]
def setBounciness(obj: F[Obj], bounciness: F[Float]): F[Unit]
def setGravity(gravity: F[Vector3]): F[Unit]
def addConstraint(base: F[Obj], part: F[Obj], pivot: F[Vector3]): F[Constraint]
def linearLimits(constraint: F[Constraint], lower: F[Vector3], upper: F[Vector3]): F[Unit]
def angularLimits(constraint: F[Constraint], lower: F[Vector3], upper: F[Vector3]): F[Unit]
def linearSpring(constraint: F[Constraint], stiffness: F[Vector3], damping: F[Vector3]): F[Unit]
def angularSpring(constraint: F[Constraint], stiffness: F[Vector3], damping: F[Vector3]): F[Unit]
def linearMotor(constraint: F[Constraint], speed: F[Vector3], force: F[Vector3]): F[Unit]
def angularMotor(constraint: F[Constraint], speed: F[Vector3], force: F[Vector3]): F[Unit]
def ifElse(cond: F[Boolean])(ifTrue: F[Unit])(ifFalse: F[Unit]): F[Unit]
def onPlay(onPlay: F[Unit]): F[Unit]
def onBoxArt(onBoxArt: F[Unit]): F[Unit]
def onTouch(onTouch: F[Fanscript.Touch] => F[Unit]): F[Unit]
def screenSizeWidth(screenSize: F[ScreenSize]): F[Float]
def screenSizeHeight(screenSize: F[ScreenSize]): F[Float]
def positionPosition(position: F[Position]): F[Vector3]
def positionRotation(position: F[Position]): F[Rotation]
def raycastHit(raycast: F[Fanscript.Raycast]): F[Boolean]
def raycastPosition(raycast: F[Fanscript.Raycast]): F[Vector3]
def raycastObj(raycast: F[Fanscript.Raycast]): F[Obj]
def sizeMin(size: F[Fanscript.Size]): F[Vector3]
def sizeMax(size: F[Fanscript.Size]): F[Vector3]
def velocityVelocity(velocity: F[Fanscript.Velocity]): F[Vector3]
def velocitySpin(velocity: F[Fanscript.Velocity]): F[Vector3]
}
object Fanscript {
trait Program[R] {
def run[F[_]](implicit interp: Fanscript[F]): F[R]
}
implicit object fancade extends Fanscript[FancadeW] {
override def lift(value: Float): FancadeW[Float] =
Fix(Fancade.Capture(
Exists(Template(
BlockDefinition.NumberValue,
value
)),
Vector(BlockDefinition.NumberValue.output)
))
override def lift(value: Vector3): FancadeW[Vector3] = ???
override def lift(value: Rotation): FancadeW[Rotation] = ???
override def lift(value: Boolean): FancadeW[Boolean] = ???
override def win(stop: Boolean): FancadeW[Unit] = ???
override def lose(stop: Boolean): FancadeW[Unit] = ???
override def setScore(score: FancadeW[Float]): FancadeW[Unit] = ???
override def setCamera(position: FancadeW[Vector3], rotation: FancadeW[Rotation], distance: FancadeW[Float]): FancadeW[Unit] = ???
override def setLight(position: FancadeW[Vector3], rotation: FancadeW[Rotation]): FancadeW[Unit] = ???
override def screenSize: FancadeW[ScreenSize] = ???
override def accelerometer: FancadeW[Vector3] = ???
override def getPosition(obj: FancadeW[Obj]): FancadeW[Position] =
Fix(Fancade.Use(
Vector(obj),
Exists(Template(
BlockDefinition.GetPosition,
()
)),
Vector(BlockDefinition.GetPosition.obj),
Vector(BlockDefinition.GetPosition.position)
))
override def setPosition(obj: FancadeW[Obj], position: FancadeW[Vector3], rotation: FancadeW[Rotation]): FancadeW[Unit] = ???
override def raycast(from: FancadeW[Vector3], to: FancadeW[Vector3]): FancadeW[Raycast] = ???
override def getSize(obj: FancadeW[Obj]): FancadeW[Size] = ???
override def setVisible(obj: FancadeW[Obj], visible: FancadeW[Boolean]): FancadeW[Unit] = ???
override def createObj(original: FancadeW[Obj]): FancadeW[Obj] = ???
override def destroyObj(obj: FancadeW[Obj]): FancadeW[Obj] = ???
override def playSound(loop: Boolean, sound: Sample)(volume: FancadeW[Float], pitch: FancadeW[Float]): FancadeW[Float] = ???
override def stopSound(channel: FancadeW[Float]): FancadeW[Unit] = ???
override def volumePitch(channel: FancadeW[Float], volume: FancadeW[Float], pitch: FancadeW[Float]): FancadeW[Unit] = ???
override def addForce(obj: FancadeW[Obj], force: FancadeW[Vector3], applyAt: FancadeW[Vector3], torque: FancadeW[Vector3]): FancadeW[Unit] = ???
override def getVelocity(obj: FancadeW[Obj]): FancadeW[Velocity] = ???
override def setVelocity(obj: FancadeW[Obj], velocity: FancadeW[Vector3], spin: FancadeW[Vector3]): FancadeW[Unit] = ???
override def setLocked(obj: FancadeW[Obj], position: FancadeW[Vector3], rotation: FancadeW[Vector3]): FancadeW[Unit] = ???
override def setMass(obj: FancadeW[Obj], mass: FancadeW[Float]): FancadeW[Unit] = ???
override def setFriction(obj: FancadeW[Obj], friction: FancadeW[Float]): FancadeW[Unit] = ???
override def setBounciness(obj: FancadeW[Obj], bounciness: FancadeW[Float]): FancadeW[Unit] = ???
override def setGravity(gravity: FancadeW[Vector3]): FancadeW[Unit] = ???
override def addConstraint(base: FancadeW[Obj], part: FancadeW[Obj], pivot: FancadeW[Vector3]): FancadeW[Constraint] = ???
override def linearLimits(constraint: FancadeW[Constraint], lower: FancadeW[Vector3], upper: FancadeW[Vector3]): FancadeW[Unit] = ???
override def angularLimits(constraint: FancadeW[Constraint], lower: FancadeW[Vector3], upper: FancadeW[Vector3]): FancadeW[Unit] = ???
override def linearSpring(constraint: FancadeW[Constraint], stiffness: FancadeW[Vector3], damping: FancadeW[Vector3]): FancadeW[Unit] = ???
override def angularSpring(constraint: FancadeW[Constraint], stiffness: FancadeW[Vector3], damping: FancadeW[Vector3]): FancadeW[Unit] = ???
override def linearMotor(constraint: FancadeW[Constraint], speed: FancadeW[Vector3], force: FancadeW[Vector3]): FancadeW[Unit] = ???
override def angularMotor(constraint: FancadeW[Constraint], speed: FancadeW[Vector3], force: FancadeW[Vector3]): FancadeW[Unit] = ???
override def ifElse(cond: FancadeW[Boolean])(ifTrue: FancadeW[Unit])(ifFalse: FancadeW[Unit]): FancadeW[Unit] = ???
override def onPlay(onPlay: FancadeW[Unit]): FancadeW[Unit] = ???
override def onBoxArt(onBoxArt: FancadeW[Unit]): FancadeW[Unit] = ???
override def onTouch(onTouch: FancadeW[Touch] => FancadeW[Unit]): FancadeW[Unit] = ???
override def screenSizeWidth(screenSize: FancadeW[ScreenSize]): FancadeW[Float] = ???
override def screenSizeHeight(screenSize: FancadeW[ScreenSize]): FancadeW[Float] = ???
override def positionPosition(position: FancadeW[Position]): FancadeW[Vector3] = ???
override def positionRotation(position: FancadeW[Position]): FancadeW[Rotation] = ???
override def raycastHit(raycast: FancadeW[Raycast]): FancadeW[Boolean] = ???
override def raycastPosition(raycast: FancadeW[Raycast]): FancadeW[Vector3] = ???
override def raycastObj(raycast: FancadeW[Raycast]): FancadeW[Obj] = ???
override def sizeMin(size: FancadeW[Size]): FancadeW[Vector3] = ???
override def sizeMax(size: FancadeW[Size]): FancadeW[Vector3] = ???
override def velocityVelocity(velocity: FancadeW[Velocity]): FancadeW[Vector3] = ???
override def velocitySpin(velocity: FancadeW[Velocity]): FancadeW[Vector3] = ???
}
case class ScreenSize(width: Float, height: Float)
case class Position(position: Vector3, rotation: Rotation)
case class Raycast(hit: Boolean, position: Vector3, obj: Obj)
case class Size(min: Vector3, max: Vector3)
case class Velocity(velocity: Vector3, spin: Vector3)
case class Touch(screenX: Float, screenY: Float)
}