Skip to content

Instantly share code, notes, and snippets.

@natansil
Last active January 4, 2020 11:20
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 natansil/5b9f5cb7ba7ebb8af1755e8f7617d936 to your computer and use it in GitHub Desktop.
Save natansil/5b9f5cb7ba7ebb8af1755e8f7617d936 to your computer and use it in GitHub Desktop.
package com.zio.pitfalls
import zio.console.putStrLn
import zio.{DefaultRuntime, Task, UIO, ZIO}
import scala.collection.mutable
case class NewOrderRequest() {
def toOrder: Order = {Order()}
}
case class NewOrderResponse()
case class Order()
trait DAO {
def insert(order: Order): Unit
def size(): Int
}
object DAO {
def make(): Task[DAO] = Task(new DAO {
val orders = new mutable.ArrayBuffer[Order]()
override def insert(order: Order): Unit = {
orders.+=(order)}
override def size(): Int = orders.size
})
}
trait MyRpcService {
def newOrder(request: NewOrderRequest): NewOrderResponse
}
object MyRpcService {
def apply(daoZ: Task[DAO]): MyRpcService = {
new MyRpcService{
override def newOrder(request: NewOrderRequest): NewOrderResponse = Runtime.unsafeRun {
for {
dao <- daoZ
_ <- ZIO.effect(dao.insert(request.toOrder))
_ <- putStrLn(s"Added an Order.")
currentSize <- ZIO.effect(dao.size())
_ <- putStrLn(s"Amount of orders: $currentSize.")
} yield NewOrderResponse()
}
}
}
}
object RPCServerSimulator {
def callEndpoints(rpcService: MyRpcService): Task[Unit] = {
ZIO.effect(rpcService.newOrder(NewOrderRequest())) *>
ZIO.effect(rpcService.newOrder(NewOrderRequest()))
}
}
object MyApp extends App with DefaultRuntime {
unsafeRun {
for {
service <- UIO(MyRpcService(DAO.make()))
_ <- RPCServerSimulator.callEndpoints(service)
} yield ()
}
}
object Runtime extends DefaultRuntime
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment