// Notice how counter can only be modified as read as [c] counter : %shared 0 inc_dec : ([I64.amount] header : "#BOLD#Thread: %#, #WHITE#Counter:# " `format `thread_id body : ^ counter {[c] c +: amount ? { amount = 1 { "#GREEN#%#" `format c } amount = -1 { "#RED#%#" `format c } { "#UNDERLINE#INVALID#" } } } `log ,(header; body; "\n") ) inc : inc_dec `bind 1 dec : inc_dec `bind -1 Inc_Dec_fn `type dec actions : %const 1_000 batch : %const 100 runner : ([Inc_Dec_fn.fn] total : actions @ total { `log "#WHITE#Batch: #CYAN#% #MAGENTA#%#\n" `format (fn; total) v : Array[`async_type fn] $ () @ 1 .. batch { v `push `async fn } @ v {[x] `await x } total -: batch } ) i : runner `async inc d : runner `async dec `log "#BOLD#YELLOW#SLEEPING THREAD %#\n" `format `thread_id `use "time" [Seconds] `use "sys" [sleep] sleep `sync Seconds $ 1 `await (d; i) `log ^ counter {[c] ? !c { `format "#BOLD#GREEN#VALID#\n" } { `format "#BOLD#RED#INVALID#\n" } }