let { run, assert, assert_eq, group, test, ? } = import! std.test let { lift } = import! std.effect.lift let { ? } = import! std.effect let { (<|) } = import! std.function let prelude = import! std.prelude let { wrap, (*>) } = import! std.applicative let { Result } = import! std.result let { ref, load } = import! std.reference let { lazy, force } = import! std.lazy let { channel, send, recv } = import! std.channel let { resume, spawn } = import! std.thread let { ? } = import! std.io // Dummy test group "deep_clone_userdata" [ test "1" <| \_ -> do { sender, receiver } = lift <| channel (lazy (\_ -> 0)) do thread = lift <| spawn ( seq send sender (lazy (\_ -> 1)) let l = lazy (\_ -> 2) let _ = force l send sender l wrap ()) lift <| resume thread do x = lift <| recv receiver match x with | Ok x -> assert_eq (force x) 1 | Err e -> error "Receive 1 error" do x = lift <| recv receiver match x with | Ok x -> assert_eq (force x) 2 | Err e -> error "Receive 2 error", test "2" <| \_ -> do r = lift <| ref 0 do { sender, receiver } = lift <| channel r do thread = lift <| spawn ( do r = ref 3 send sender r wrap ()) do r = lift <| resume thread match r with | Ok () -> wrap () | Err e -> error e do r = lift <| recv receiver match r with | Ok x -> do x = lift <| load x assert_eq x 3 | Err e -> error "Receive 3 error" ]