This PR implements a basic async framework as well as asynchronously running timers using libuv. --------- Co-authored-by: Sofia Rodrigues <sofia@algebraic.dev> Co-authored-by: Markus Himmel <markus@himmel-villmar.de> Co-authored-by: Markus Himmel <markus@lean-fro.org>
99 lines
2.2 KiB
Text
99 lines
2.2 KiB
Text
import Std.Internal.Async.Timer
|
|
|
|
/-
|
|
these tests are just some preliminary ones as `async_sleep.lean` already contains extensive tests
|
|
for the entire timer state machine and `Async.Timer` is merely a light wrapper around it.
|
|
-/
|
|
|
|
open Std.Internal.IO.Async
|
|
|
|
def BASE_DURATION : Std.Time.Millisecond.Offset := 10
|
|
|
|
namespace SleepTest
|
|
|
|
def oneSleep : IO Unit := do
|
|
let task ← go
|
|
assert! (← task.block) == 37
|
|
where
|
|
go : IO (AsyncTask Nat) := do
|
|
let sleep ← Sleep.mk BASE_DURATION
|
|
(← sleep.wait).mapIO fun _ =>
|
|
return 37
|
|
|
|
def doubleSleep : IO Unit := do
|
|
let task ← go
|
|
assert! (← task.block) == 37
|
|
where
|
|
go : IO (AsyncTask Nat) := do
|
|
let sleep ← Sleep.mk BASE_DURATION
|
|
(← sleep.wait).bindIO fun _ => do
|
|
(← sleep.wait).mapIO fun _ =>
|
|
return 37
|
|
|
|
def resetSleep : IO Unit := do
|
|
let task ← go
|
|
assert! (← task.block) == 37
|
|
where
|
|
go : IO (AsyncTask Nat) := do
|
|
let sleep ← Sleep.mk BASE_DURATION
|
|
let waiter ← sleep.wait
|
|
sleep.reset
|
|
waiter.mapIO fun _ =>
|
|
return 37
|
|
|
|
def simpleSleep : IO Unit := do
|
|
let task ← go
|
|
assert! (← task.block) == 37
|
|
where
|
|
go : IO (AsyncTask Nat) := do
|
|
(← sleep BASE_DURATION).mapIO fun _ =>
|
|
return 37
|
|
|
|
#eval oneSleep
|
|
#eval doubleSleep
|
|
#eval resetSleep
|
|
#eval simpleSleep
|
|
|
|
end SleepTest
|
|
|
|
namespace IntervalTest
|
|
|
|
def oneSleep : IO Unit := do
|
|
let task ← go
|
|
assert! (← task.block) == 37
|
|
where
|
|
go : IO (AsyncTask Nat) := do
|
|
let interval ← Interval.mk BASE_DURATION
|
|
(← interval.tick).mapIO fun _ => do
|
|
interval.stop
|
|
return 37
|
|
|
|
def doubleSleep : IO Unit := do
|
|
let task ← go
|
|
assert! (← task.block) == 37
|
|
where
|
|
go : IO (AsyncTask Nat) := do
|
|
let interval ← Interval.mk BASE_DURATION
|
|
(← interval.tick).bindIO fun _ => do
|
|
(← interval.tick).mapIO fun _ => do
|
|
interval.stop
|
|
return 37
|
|
|
|
def resetSleep : IO Unit := do
|
|
let task ← go
|
|
assert! (← task.block) == 37
|
|
where
|
|
go : IO (AsyncTask Nat) := do
|
|
let interval ← Interval.mk BASE_DURATION
|
|
(← interval.tick).bindIO fun _ => do
|
|
let waiter ← interval.tick
|
|
interval.reset
|
|
waiter.mapIO fun _ => do
|
|
interval.stop
|
|
return 37
|
|
|
|
#eval oneSleep
|
|
#eval doubleSleep
|
|
#eval resetSleep
|
|
|
|
end IntervalTest
|