Skip to content

Instantly share code, notes, and snippets.

@dgouyette
Created January 2, 2017 15:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dgouyette/38b8c7a25af4c78ec1fae22598f22e32 to your computer and use it in GitHub Desktop.
Save dgouyette/38b8c7a25af4c78ec1fae22598f22e32 to your computer and use it in GitHub Desktop.
package stripes
import cats.free.Free
import cats.~>
import freek._
object Log {
sealed trait LogLevel
case object ErrorLevel extends LogLevel
case object WarnLevel extends LogLevel
case object InfoLevel extends LogLevel
case object DebugLevel extends LogLevel
trait DSL[A]
case class LogMsg(level: LogLevel, msg: String) extends DSL[Unit]
/** just helpers without any weird implicits */
def debug(msg: String) = LogMsg(DebugLevel, msg)
def info(msg: String) = LogMsg(InfoLevel, msg)
}
object Logger extends (Log.DSL ~> cats.Id) {
def apply[A](a: Log.DSL[A]) = a match {
case Log.LogMsg(lvl, msg) =>
println(s"$lvl $msg")
}
}
object Program {
type PRG = Log.DSL :|: NilDSL
val PRG = DSL.Make[PRG]
def prog : Free[PRG.Cop, Unit] = for {
_ <- Log.debug("This is a debug").freek[PRG]
} yield ()
val interpreter = Logger
def main(args: Array[String]): Unit = {
// println(prog.interpret(interpreter))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment