1 import Base 2 import ./world.bend as W 3 import ./system.bend as Sys 4 import ./event_runtime.bend as Ev 5 import ./event_stream.bend as Stream 6 import ./event_family_routing.bend as Route 7 8 # Raw selectors are trusted engine bindings. Ordinary Setup derives matching paths. 9 # Skip does not activate an absent position; disposal removes only after Sys validation. 10 def position(~S:Data,stream:Stream.Stream,id:U32,tick:Nat,dispose:Bool) -> Stream.Stream: 11 match stream: 12 case Stream.Stream{domain,batches,positions,nextReader,frameStart,boundary,capacity,dropped}:Stream.Stream{domain,batches,Ev.update(positions,id,tick,dispose),nextReader,frameStart,boundary,capacity,dropped} 13 def positioned(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,world:W.World,+tick:Nat,id:U32,dispose:Bool,returned:F & Stream.Stream) -> Route.Runtime: 14 match returned: 15 case (family,stream):Route.Runtime{world,put(family,position(~S,stream,id,tick,dispose)),tick} 16 def skip_checked(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,allowed:Bool,runtime:Route.Runtime,reader:Route.Reader,id:U32) -> Route.Runtime & Route.Reader: 17 match allowed runtime: 18 case False{} runtime:(runtime,reader) 19 case True{} Route.Runtime{world,family,+tick}:(positioned(~S,~C,~R,~E,~F,~take,~put,world,tick,id,False{},take(family)),reader) 20 def skip_named(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,family:F,tick:Nat,reader:Route.Reader,named:W.World & U32) -> Route.Runtime & Route.Reader: 21 match reader named: 22 case Route.Reader{+namespace,+id,+registryId}, (world,+actual):skip_checked(~S,~C,~R,~E,~F,~take,~put,U32.is_eq(actual,namespace),Route.Runtime{world,family,tick},Route.Reader{namespace,id,registryId},id) 23 def skip(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,runtime:Route.Runtime,reader:Route.Reader) -> Route.Runtime & Route.Reader: 24 match runtime: 25 case Route.Runtime{world,family,tick}:skip_named(~S,~C,~R,~E,~F,~take,~put,family,tick,reader,W.namespace(~S,~C,~R,~E,world)) 26 type Disposal F & Stream.Stream,-put:F -> Stream.Stream -> F,-runner:W.World -> Ev.Input -> Sys.Outcome,Error,Out>> is Type: 27 Disposed{runtime:Route.Runtime} 28 DisposalRejected{runtime:Route.Runtime,reader:Route.Reader,registry:Sys.Registry,Error,Out,runner>} 29 def disposed(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World -> Ev.Input -> Sys.Outcome,Error,Out>,family:F,tick:Nat,reader:Route.Reader,id:U32,result:Sys.Disposal,Error,Out,runner>) -> Disposal: 30 match result: 31 case Sys.Disposed{world}:Disposed{positioned(~S,~C,~R,~E,~F,~take,~put,world,tick,id,True{},take(family))} 32 case Sys.DisposalRejected{world,registry}:DisposalRejected{Route.Runtime{world,family,tick},reader,registry} 33 def dispose_checked(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World -> Ev.Input -> Sys.Outcome,Error,Out>,allowed:Bool,world:W.World,family:F,tick:Nat,reader:Route.Reader,registry:Sys.Registry,Error,Out,runner>,id:U32) -> Disposal: 34 match allowed: 35 case False{}:DisposalRejected{Route.Runtime{world,family,tick},reader,registry} 36 case True{}:disposed(~S,~C,~R,~E,~F,~take,~put,~Args,~Error,~Out,~runner,family,tick,reader,id,Sys.dispose(~S,~C,~R,~E,~Ev.Input,~Error,~Out,~runner,registry,world)) 37 def dispose_named(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World -> Ev.Input -> Sys.Outcome,Error,Out>,family:F,tick:Nat,reader:Route.Reader,registry:Sys.Registry,Error,Out,runner>,actualId:U32,named:W.World & U32) -> Disposal: 38 match reader named: 39 case Route.Reader{+namespace,+id,+registryId}, (world,+actualNamespace):dispose_checked(~S,~C,~R,~E,~F,~take,~put,~Args,~Error,~Out,~runner,Bool.and(U32.is_eq(actualNamespace,namespace),U32.is_eq(actualId,registryId)),world,family,tick,Route.Reader{namespace,id,registryId},registry,id) 40 def dispose_identified(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World -> Ev.Input -> Sys.Outcome,Error,Out>,runtime:Route.Runtime,reader:Route.Reader,identified:Sys.Registry,Error,Out,runner> & U32) -> Disposal: 41 match runtime identified: 42 case Route.Runtime{world,family,tick}, (registry,id):dispose_named(~S,~C,~R,~E,~F,~take,~put,~Args,~Error,~Out,~runner,family,tick,reader,registry,id,W.namespace(~S,~C,~R,~E,world)) 43 def dispose(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World -> Ev.Input -> Sys.Outcome,Error,Out>,runtime:Route.Runtime,reader:Route.Reader,registry:Sys.Registry,Error,Out,runner>) -> Disposal: 44 dispose_identified(~S,~C,~R,~E,~F,~take,~put,~Args,~Error,~Out,~runner,runtime,reader,Sys.identity(~S,~C,~R,~E,~Ev.Input,~Error,~Out,~runner,registry)) 45 def selected(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,world:W.World,tick:Nat,returned:F & Stream.Stream) -> Route.Runtime & Stream.Stream: 46 match returned: 47 case (family,stream):(Route.Runtime{world,family,tick},stream) 48 def inspect(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream,~put:F -> Stream.Stream -> F,runtime:Route.Runtime) -> Route.Runtime & Stream.Stream: 49 match runtime: 50 case Route.Runtime{world,family,tick}:selected(~S,~C,~R,~E,~F,~take,~put,world,tick,take(family))