Concurrency.select.relay: def of bend-kit-concurrency@0.2.0.0 Import: import bend-kit-concurrency@0.2.0.0/concurrency.bend as Concurrency Lines 249-277 of bend-kit-concurrency@0.2.0.0/concurrency.bend: https://jend.leeeet.dev/read.txt?path=bend-kit-concurrency@0.2.0.0/concurrency.bend&start_line=249&end_line=277 import Base # Forwards each value of src to out as (i, value), then reports on done. # It stops when src closes, or when out is closed under it. def select.relay( -A: Type, fuel: Nat, +i: U32, +src: Chan(A), +out: Chan(U32 & A), +done: Chan(Unit), r: Relay ) -> IO(Result<&1, &1, Unit, Unit>): match fuel: case 0n: Chan.send(Unit, done, Unit{}) case 1n+p: match r: case RWait{}: do IO>: got : Maybe<&1, A> <- Chan.recv(A, src) select.relay(A, p, i, src, out, done, RGot{got}) case RGot{got}: match got: case None{}: Chan.send(Unit, done, Unit{}) case Some{x}: do IO>: ok : Result<&1, &1, U32 & A, Unit> <- Chan.send(U32 & A, out, (i, x)) select.relay(A, p, i, src, out, done, RSent{ok}) case RSent{ok}: match ok: case Done{u}: select.relay(A, p, i, src, out, done, RWait{}) case Fail{held}: Chan.send(Unit, done, Unit{}) Uses (13): https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Chan https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Chan.recv https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Chan.send https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=IO https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=IO.bind https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Maybe https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Nat https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Pair https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Result https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Sigma https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=U32 https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Unit https://jend.leeeet.dev/definition.txt?path=bend-kit-concurrency@0.2.0.0/concurrency.bend&name=Relay