Last active
June 13, 2017 03:50
-
-
Save j5ik2o/78bf4b3dfd3f94c16e8bb1f19ae11970 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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