-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy patheff.tao
51 lines (42 loc) · 1.17 KB
/
eff.tao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import "../lib/std.tao"
# Desugar of...
#fn greet : io ~ Str is (
# let name <- input!;
# print("Hello, " ++ name)!;
# name
#)
class Effect =
=> Waiting
=> Ready
=> Input
=> Output
=> Final
=> pull : Self.Output -> Self.Waiting -> Go Self.Ready (Self.Output, Self.Final)
=> push : Self.Ready -> (Self.Input, Self.Waiting)
data Greet
data GreetWaiting =
| Initial
\ SayHello Str
data GreetReady =
\ GotName (@, Str)
member Greet of Effect =
=> Waiting = GreetWaiting
=> Ready = GreetReady
=> Input = @
=> Output = @
=> Final = Str
=> pull = fn
| uni, Initial => Next GotName input(uni)
\ uni, SayHello name =>
let (uni, ()) = print("Hello, " ++ name, uni) in
Done (uni, name)
=> push = fn
\ GotName (uni, name) => (uni, SayHello name)
fn eval : Greet.Waiting -> @ -> (@, Str) =
\ waiting, uni => when Greet.pull(uni, waiting) is
| Next ready => when Greet.push(ready) is
\ (uni, waiting) => eval(waiting, uni)
\ Done (uni, name) => (uni, name)
fn main : @ -> (@, ()) = uni =>
let (uni, _) = eval(Initial, uni) in
(uni, ())