Skip to content

Instantly share code, notes, and snippets.

trait DocumentRoute[F[_]] extends DocumentRepository[F]{
def F: Monad[F]
val getDocuments: Route = (get & path("documents")) {
complete(
documents()
)
}
trait S3DocumentRepository[Future] {
def documents:Future[Seq[Document]] = ???
}
trait DocumentRepository[F[_]] {
def documents: F[Seq[Document]]
}
object idInterpreter extends (IndexAlg ~> Id) {
override def apply[A](fa: IndexAlg[A]): Id[A] = fa match {
case CreateIndex(_) => ().asRight[String]
case DeleteIndex(_) => ().asRight[String]
}
}
def recreateIndex(name: String): IndexDSL[Either[String, CreateIndexResponse]] =
for {
_ <- deleteIndex(name)
created <- createIndex(name)
} yield created
type IndexDSL[A] = Free[IndexAlg, A]
def createIndex(name: String): IndexDSL[Either[String, CreateIndexResponse]] = Free.liftF(CreateIndex(name))
def deleteIndex(name: String): IndexDSL[Either[String, DeleteIndexResponse]] = Free.liftF(DeleteIndex(name))
def recreateIndex(name: String) =
for {
_ <- deleteIndex(name)
created <- createIndex(name)
} yield created
val sequentialFuture = for {
x <- Future { Thread sleep 1000; 10 }
y <- Future { Thread sleep 2000; 32 }
} yield x + y
sealed trait IndexAlg[A]
case class CreateIndex(name: String) extends IndexAlg[Either[String, CreateIndexResponse]]
case class DeleteIndex(name: String) extends IndexAlg[Either[String, DeleteIndexResponse]]
import cats.{Id, Monad}
import cats.data.EitherT
import cats.implicits._
import cats.syntax.functor._
import cats.syntax.flatMap._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global