lean4-htt/tests/lean/run/async_base_functions.lean
Kim Morrison c06af84d9f
fix: refactor grind's module/ring design to avoid a diamond (#9168)
This PR resolves a defeq diamond, which caused a problem in Mathlib:
```
import Mathlib

example (R : Type) [I : Ring R] :
  @AddCommGroup.toGrindIntModule R (@Ring.toAddCommGroup R I) =
    @Lean.Grind.Ring.instIntModule R (@Ring.toGrindRing R I) := rfl -- fails
```
2025-07-03 06:50:46 +00:00

54 lines
1.4 KiB
Text

import Std.Internal.Async
import Std.Sync.Mutex
open Std
open Std.Internal.IO.Async
def wait (ms : UInt32) (ref : Std.Mutex Nat) (val : Nat) : Async Unit := do
ref.atomically (·.modify (· * val))
IO.sleep ms
ref.atomically (·.modify (· + val))
-- Tests
def sequential : Async Unit := do
let ref ← Std.Mutex.new 0
wait 200 ref 1
wait 400 ref 2
ref.atomically (·.modify (· * 10))
assert! (← ref.atomically (·.get)) == 40
#eval do (← sequential.toEIO).block
def conc : Async Unit := do
let ref ← Std.Mutex.new 0
discard <| concurrently (wait 200 ref 1) (wait 400 ref 2)
ref.atomically (·.modify (· * 10))
assert! (← ref.atomically (·.get)) == 30
#eval do (← conc.toEIO).block
def racer : Async Unit := do
let ref ← Std.Mutex.new 0
race (wait 200 ref 1) (wait 400 ref 2)
ref.atomically (·.modify (· * 10))
assert! (← ref.atomically (·.get)) == 10
#eval do (← racer.toEIO).block
def concAll : Async Unit := do
let ref ← Std.Mutex.new 0
discard <| concurrentlyAll #[(wait 200 ref 1), (wait 400 ref 2)]
ref.atomically (·.modify (· * 10))
assert! (← ref.atomically (·.get)) == 30
#eval do (← concAll.toEIO).block
def racerAll : Async Unit := do
let ref ← Std.Mutex.new 0
raceAll #[(wait 200 ref 1), (wait 400 ref 2)]
ref.atomically (·.modify (· * 10))
assert! (← ref.atomically (·.get)) == 10
#eval do (← racerAll.toEIO).block