zio
-
Ref vs Ref.Synchronizedzio/zio2 2022. 12. 9. 19:30
Ref 와 Ref.Synchronized 의 차이는 무엇일까? Ref update function may be run more than once import zio._ object RefApp extends zio.ZIOAppDefault { def demo: UIO[Unit] = { def task(id: Int, ref: Ref[Int]): UIO[Unit] = ref.modify(prev => (println(s"Task $id updating ref at $prev"), id)) for { ref Task5 --> Task3 --> Task2 --> Task4 순으로 ref state 를 업데이트 했다. Task 1 updating ref at 0 Task 3 updating ref at 0 Ta..
-
Error Modelszio/zio2 2022. 11. 20. 23:12
Errors = failures present in the ZIO type signature ("checked" errors) Defects = failures that are unrecoverable, unforeseen, NOT present in the ZIO type signature ZIO[R,E,A] can finish with Exit[E,A] - Success[A] containing a value - Cause[E] - Fail[E] containing the error - Die(t: Throwable) which was unforeseen val failedInt: ZIO[Any, String, Int] = ZIO.fail("I failed!") val failureCauseExpos..
-
Option 처리하기zio/zio2 2022. 11. 20. 16:15
some, asSomeError, unsome 등의 사용법을 보자. (+ asSome) 각기 다른 Error type 을 Option[Throwable] 로 만들어 composing 했다. ZIO#flattenErrorOption 도 참고하자. val maybeId: ZIO[Any, Option[Nothing], String] = ZIO.fromOption(Some("abc123")) def getUser(userId: String): ZIO[Any, Throwable, Option[User]] = ??? def getTeam(teamId: String): ZIO[Any, Throwable, Team] = ??? val result: ZIO[Any, Throwable, Option[(User, Team)..
-
ZLayer 를 이용한 dependency injectionzio/zio2 2022. 7. 27. 20:05
문제 zio1 에서의 zlayer example 을 zio2 의 zlayer 를 이용해 구현해 보자 코드 아래처럼는 공식 가이드를 이용해 작성한 코드이지만.. 개인적으로 생각하는 코드는 바로 아래에 추가했다. import zio._ import java.util.concurrent.TimeUnit object ZLayerTest extends zio.ZIOAppDefault { trait Logging { def log(line: String): UIO[Unit] } object Logging { def log(line: String): URIO[Logging, Unit] = ZIO.serviceWithZIO[Logging](_.log(line)) } case class LoggingLive(ref: R..
-
ZIO prelude 의 Reader Monadzio/zio-prelude 2022. 7. 24. 00:34
문제 zpure 를 이용한 Reader Monad 를 살펴보자 코드 import zio._ import zio.prelude.Reader case class Cat(name: String) case class Dog(name: String) object ZpureReaderTest { def main(args: Array[String]): Unit = { val catName: Reader[Cat, String] = Reader.serviceWith(_.name) val dogName: Reader[Dog, String] = Reader.serviceWith(_.name) val allName: Reader[Dog with Cat, String] = for { c
-
java callback 을 ZIO 로 바꾸기zio/zio2 2022. 7. 17. 17:04
문제 https://wefree.tistory.com/199 에서는 java callback 를 scala Future 로 바꾸었다. 이번에는 ZIO.asyncZIO() 를 이용해 ZIO 로 변경해 보자. https://wefree.tistory.com/199 와 동일하게 java Async Http Client 의 callback 을 살펴보자. val asyncHttpClient = org.asynchttpclient.Dsl.asyncHttpClient() val listenableFuture = asyncHttpClient.prepareGet("https://api.agify.io/?name=meelad").execute() val listener = new Runnable { override def..
-
Functional Effect 의 다양한 합성(composition)zio/zio-prelude 2021. 10. 10. 22:49
문제 아래와 같이 A, B, C, D 를 정의할 때, 다양하게 합성해 보자. def A: Option[String] = { println("A") Some("A") } def B: Option[Int] = { println("B") Some(1) } def C: Option[String] = { println("C") None } def D: Option[Int] = { println("D") None } 코드 Monad 합성 val monad: Option[(String, String)] = for { c "C is empty") def aValid: Validation[String, String] = Validation.fromOption(A).mapError(_ => "A is empty") val..