let { run, assert_eq, test, ? } = import! std.test
let { lift } = import! std.effect.lift
let { (<|) } = import! std.function
let prelude = import! std.prelude
let { Bool } = import! std.bool
let int = import! std.int
let { ? } = import! std.io
let result @ { Result, ? } = import! std.result
let string = import! std.string
let unit @ { ? } = import! std.unit
let { Applicative, wrap, (*>) } = import! std.applicative
let { flat_map } = import! std.monad
let { send, recv, channel } = import! std.channel
let { spawn, yield, resume } = import! std.thread
let { ? } = import! std.effect
let assert_any_err =
assert_eq ?(result.show ?string.show ?unit.show)
?(result.eq ?{ (==) = \x y -> True } ?unit.eq)
let assert_recv channel expect : [Eq a] -> [Show a] -> _ -> Result () a -> _ =
do x = lift <| recv channel
assert_eq x expect
test "thread" <| \_ ->
do { sender, receiver } = lift <| channel 0
do thread = lift <| spawn (
seq send sender 0
let _ = yield ()
seq send sender 1
wrap ()
)
seq lift <| resume thread
seq assert_recv receiver (Ok 0)
seq assert_recv receiver (Err ())
seq lift <| resume thread
seq assert_recv receiver (Ok 1)
seq assert_recv receiver (Err ())
do x = lift <| resume thread
assert_any_err x (Err "Any error message here")