Skip to content

Commit 645f9e6

Browse files
author
Your Name
committed
Add Async helper with tick-based interleaving
1 parent 65ff733 commit 645f9e6

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

platform/Async.roc

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
module [
2+
Async,
3+
after_ticks,
4+
from_task!,
5+
map!,
6+
poll!,
7+
]
8+
9+
Async a err : [Pending { remaining : U64, step! : {} => Result a err }, Ready a]
10+
11+
poll! : Async a err => Result (Async a err) err
12+
poll! = |async|
13+
when async is
14+
Ready(val) -> Ok(Ready(val))
15+
Pending({ remaining, step! }) ->
16+
if remaining == 0 then
17+
when step!({}) is
18+
Ok(val) -> Ok(Ready(val))
19+
Err(err) -> Err(err)
20+
else
21+
Ok(Pending({ remaining: remaining - 1, step! }))
22+
23+
from_task! : ({} => Result a err) => Async a err
24+
from_task! = |task!|
25+
Pending({ remaining: 0, step!: task! })
26+
27+
map! : (a -> b), Async a err => Async b err
28+
map! = |f, async|
29+
when async is
30+
Ready(val) -> Ready(f(val))
31+
Pending({ remaining, step! }) ->
32+
Pending({
33+
remaining,
34+
step!: |{}|
35+
when step!({}) is
36+
Ok(val) -> Ok(f(val))
37+
Err(err) -> Err(err),
38+
})
39+
40+
after_ticks : U64 -> Async {} []
41+
after_ticks = |ticks|
42+
Pending({ remaining: ticks, step!: |{}| Ok({}) })

platform/main.roc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ platform "cli"
2121
Random,
2222
Gmp,
2323
Math,
24+
Async,
2425
]
2526
packages {}
2627
imports []

0 commit comments

Comments
 (0)