Skip to content

Instantly share code, notes, and snippets.

def program[F[_]](implicit M: Monad[F]): IndexedReaderWriterStateT[F, Env, Vector[SystemState], SystemState, SystemState, SystemState] = {
for {
// retrieve environment input
env <- IndexedReaderWriterStateT.ask[F, Env, Vector[SystemState], SystemState]
// get server status as F[Status] and lift into transformer context
statusF = getServerStatus[F]().apply(env)
status <- IndexedReaderWriterStateT.liftF[F, Env, Vector[SystemState], SystemState, Status](statusF)
// get current state
program[IO].run(Env("127.0.0.1:8080"), SystemState(Map.empty[Env, Status])) // IO[(Vector[SystemState], SystemState, SystemState)]
trait MonadWriter[F[_], L] {
val monad: Monad[F]
def tell(l: L): F[Unit]
def logs: F[L]
}
trait MonadState[F[_], S] {
val monad: Monad[F]
def createMonadWriter[L](implicit M: Monoid[L]): IO[MonadWriter[IO, L]] = {
for {
writer <- Ref.of[IO, L](M.empty)
} yield new MonadWriter[IO, L] {
val monad: Monad[IO] = Monad[IO]
def tell(l: L): IO[Unit] = writer.update(_.combine(l))
def logs: IO[L] = writer.get
}
}
def program[F[_]](R: MonadReader[F, Env],
W: MonadWriter[F, Vector[SystemState]],
S: MonadState[F, SystemState]): F[(Vector[SystemState], SystemState)] = {
implicit val M: Monad[F] = R.monad
for {
status <- R.reader(getServerStatus[F]())
state <- S.get
def main(): IO[(Vector[SystemState], SystemState)] = {
for {
monadReader <- createMonadReader(Env("127.0.0.1:8080"))
monadWriter <- createMonadWriter[Vector[SystemState]]
monadState <- createMonadState(SystemState(Map.empty[Env, Status]))
result <- program(monadReader, monadWriter, monadState)
} yield result
}
trait Set {
def get(index: Long): ???
def add(value: ???): Set
}
trait Set {
def get(index: Long): Any
def add(value: Any): Set
}
trait DoubleSet {
def get(index: Long): Double
def add(value: Double): Set
}
trait StringSet {
def get(index: Long): String
def add(value: String): Set
}