| def assertBEq [BEq α] [ToString α] (caption : String) (actual expected : α) : IO Unit := do | |
| unless actual == expected do | |
| throw <| IO.userError <| | |
| s!"{caption}: expected '{expected}', got '{actual}'" | |
| def test : IO Unit := do | |
| let p1 : IO.Promise Unit ← IO.Promise.new -- resolving queues the task | |
| let p2 : IO.Promise Unit ← IO.Promise.new -- resolved once task is running | |
| let p3 : IO.Promise Unit ← IO.Promise.new -- resolving finishes the task | |
| let t ← BaseIO.mapTask (fun _ => do p2.resolve (); IO.wait p3.result?) p1.result? | |
| assertBEq "p1" (← IO.getTaskState p1.result?) .running | |
| assertBEq "p2" (← IO.getTaskState p2.result?) .running | |
| assertBEq "p3" (← IO.getTaskState p3.result?) .running | |
| assertBEq "t" (← IO.getTaskState t) .waiting | |
| p1.resolve () | |
| assertBEq "p1" (← IO.getTaskState p1.result?) .finished | |
| let _ ← IO.wait p2.result? | |
| assertBEq "p2" (← IO.getTaskState p2.result?) .finished | |
| assertBEq "t" (← IO.getTaskState t) .running | |
| p3.resolve () | |
| assertBEq "p3" (← IO.getTaskState p3.result?) .finished | |
| let _ ← IO.wait t | |
| assertBEq "t" (← IO.getTaskState t) .finished | |
| #eval test |