Skip to content

Instantly share code, notes, and snippets.

@j5ik2o
Last active June 13, 2017 03:50
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 j5ik2o/78bf4b3dfd3f94c16e8bb1f19ae11970 to your computer and use it in GitHub Desktop.
Save j5ik2o/78bf4b3dfd3f94c16e8bb1f19ae11970 to your computer and use it in GitHub Desktop.
package app
import cats.free._
import cats._
class DDD[ID, E] {
def resolveBy(id: ID): Free[RepositoryDSL, Option[E]] = Free.liftF(ResolveBy(id))
def store(id: ID, entity: E): Free[RepositoryDSL, Unit] = Free.liftF(Store(id, entity))
sealed abstract class RepositoryDSL[A]
final case class ResolveBy(id: ID) extends RepositoryDSL[Option[E]]
final case class Store(id: ID, entity: E) extends RepositoryDSL[Unit]
}
object Sample extends App {
type UserId = Int
final case class User(id: UserId, name: String)
val ddd = new DDD[UserId, User]
val user1 = User(1, "aaa")
val user2 = User(2, "bbb")
val program = for {
_ <- ddd.store(user1.id, user1)
_ <- ddd.store(user2.id, user2)
user <- ddd.resolveBy(user1.id)
} yield user
// TODO: SqlActionをDBIO.sequenceで返したい
val interpreter = new (ddd.RepositoryDSL ~> Id) {
val database = collection.mutable.Map.empty[UserId, User]
override def apply[A](fa: ddd.RepositoryDSL[A]) = fa match {
case ddd.ResolveBy(id) =>
database.get(id).asInstanceOf[A]
case ddd.Store(id, entity) =>
database.put(id, entity)
()
}
}
// TODO: SqlActionをDBIOを返したい → 取得したdb.run(action)したい
val result: Option[User] = program.foldMap(interpreter)
println(result)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment