1
1
enum IO [- R , + E , + A ]:
2
2
def map [B ](f : A => B ): IO [R , E , B ] = this .flatMap(a => IO .succeed(f(a)))
3
3
4
+ def flatMap [R2 , E2 , B ](f : A => IO [R2 , E2 , B ]): IO [R2 & R , E2 | E , B ] = IO .FlatMap (this , f)
5
+
6
+ def foldM [R2 , E2 , A2 , R3 , E3 , A3 ](f : A => IO [R2 , E2 , A2 ], g : E => IO [R3 , E3 , A3 ]): IO [R3 & R2 & R , E3 | E2 , A3 | A2 ] = IO .Fold (this , f, g)
7
+
8
+ def inject [R2 , R3 ](r : R2 )(implicit tag : Tag [R2 ], ev : R2 & R3 => R ): IO [R3 , E , A ] = IO .Provide (this , r, tag, ev)
9
+
10
+ def catchAll [R2 , E2 , A2 ](f : E => IO [R2 , E2 , A2 ]) = this .foldM(IO .succeed, f)
11
+
12
+ def catchSome [R2 , E2 , A2 , E3 , E4 ](f : PartialFunction [E , (E3 , IO [R2 , E2 , A2 ])])(implicit ev : E => E3 | E4 ): IO [R & R2 , E2 | E4 , A | A2 ] = this .foldM(IO .succeed, e => {
13
+ f.lift(e) match {
14
+ case Some ((e3, io)) if e3 == e => io
15
+ case _ => IO .fail(ev(e).asInstanceOf [E4 ])
16
+ }
17
+ })
18
+
4
19
case Succeed [A ](
5
20
val a : () => A
6
21
) extends IO [Any , Nothing , A ]
@@ -29,10 +44,6 @@ enum IO[-R, +E, +A]:
29
44
30
45
class Tag [A ]()
31
46
32
- extension [R , E , A ](zio : IO [R , E , A ])
33
- def flatMap [R2 , E2 , B ](f : A => IO [R2 , E2 , B ]): IO [R2 & R , E2 | E , B ] = IO .FlatMap (zio, f)
34
- def inject [R2 , R3 ](r : R2 )(implicit tag : Tag [R2 ], ev : R2 & R3 => R ): IO [R3 , E , A ] = IO .Provide (zio, r, tag, ev)
35
-
36
47
enum Exit [+ E , + A ]:
37
48
case Fail (e : E )
38
49
case Succeed (a : A )
@@ -49,7 +60,6 @@ extension [E, A](zio: IO[Any, E, A])
49
60
var cont = List [ContiuationFrame ]()
50
61
var services = Map [Tag [Any ], Any ]()
51
62
52
- // recursing
53
63
var recursing = true
54
64
55
65
while (recursing) {
@@ -136,6 +146,8 @@ extension [E, A](zio: IO[Any, E, A])
136
146
137
147
object IO {
138
148
def succeed [A ](a : => A ): IO [Any , Nothing , A ] = Succeed (() => a)
149
+
139
150
def fail [E ](e : => E ): IO [Any , E , Nothing ] = Fail (() => e)
151
+
140
152
def use [R , R2 , E2 , A ](f : R => IO [R2 , E2 , A ])(implicit tag : Tag [R ]): IO [R & R2 , E2 , A ] = Use (f, tag)
141
153
}
0 commit comments