owned_event_family_lifecycle.bend
bendvy-ecs-core@0.1.0.1 · 50 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.1/world.bend as W
3import bendvy-ecs-core@0.1.0.1/system.bend as Sys
4import bendvy-ecs-core@0.1.0.1/event_runtime.bend as Ev
5import bendvy-ecs-core@0.1.0.1/event_stream.bend as Stream
6import bendvy-ecs-core@0.1.0.1/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.
10def position(~S:Data,stream:Stream.Stream<S,Nat>,id:U32,tick:Nat,dispose:Bool) -> Stream.Stream<S,Nat>:
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}
13def positioned(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,world:W.World<S,C,R,E>,+tick:Nat,id:U32,dispose:Bool,returned:F & Stream.Stream<S,Nat>) -> Route.Runtime<S,C,R,E,F>:
14 match returned:
15 case (family,stream):Route.Runtime{world,put(family,position(~S,stream,id,tick,dispose)),tick}
16def skip_checked(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,allowed:Bool,runtime:Route.Runtime<S,C,R,E,F>,reader:Route.Reader<S,Nat,F,take,put>,id:U32) -> Route.Runtime<S,C,R,E,F> & Route.Reader<S,Nat,F,take,put>:
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)
20def skip_named(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,family:F,tick:Nat,reader:Route.Reader<S,Nat,F,take,put>,named:W.World<S,C,R,E> & U32) -> Route.Runtime<S,C,R,E,F> & Route.Reader<S,Nat,F,take,put>:
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)
23def skip(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,runtime:Route.Runtime<S,C,R,E,F>,reader:Route.Reader<S,Nat,F,take,put>) -> Route.Runtime<S,C,R,E,F> & Route.Reader<S,Nat,F,take,put>:
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))
26type Disposal<S:Data,C:Type,R:Type,E:Data,F:Type,Args:Type,Error:Data,Out:Type,-take:F -> F & Stream.Stream<S,Nat>,-put:F -> Stream.Stream<S,Nat> -> F,-runner:W.World<S,C,R,E> -> Ev.Input<Nat,Args> -> Sys.Outcome<W.World<S,C,R,E>,Error,Out>> is Type:
27 Disposed{runtime:Route.Runtime<S,C,R,E,F>}
28 DisposalRejected{runtime:Route.Runtime<S,C,R,E,F>,reader:Route.Reader<S,Nat,F,take,put>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Error,Out,runner>}
29def disposed(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World<S,C,R,E> -> Ev.Input<Nat,Args> -> Sys.Outcome<W.World<S,C,R,E>,Error,Out>,family:F,tick:Nat,reader:Route.Reader<S,Nat,F,take,put>,id:U32,result:Sys.Disposal<S,C,R,E,Ev.Input<Nat,Args>,Error,Out,runner>) -> Disposal<S,C,R,E,F,Args,Error,Out,take,put,runner>:
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}
33def dispose_checked(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World<S,C,R,E> -> Ev.Input<Nat,Args> -> Sys.Outcome<W.World<S,C,R,E>,Error,Out>,allowed:Bool,world:W.World<S,C,R,E>,family:F,tick:Nat,reader:Route.Reader<S,Nat,F,take,put>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Error,Out,runner>,id:U32) -> Disposal<S,C,R,E,F,Args,Error,Out,take,put,runner>:
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<Nat,Args>,~Error,~Out,~runner,registry,world))
37def dispose_named(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World<S,C,R,E> -> Ev.Input<Nat,Args> -> Sys.Outcome<W.World<S,C,R,E>,Error,Out>,family:F,tick:Nat,reader:Route.Reader<S,Nat,F,take,put>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Error,Out,runner>,actualId:U32,named:W.World<S,C,R,E> & U32) -> Disposal<S,C,R,E,F,Args,Error,Out,take,put,runner>:
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)
40def dispose_identified(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World<S,C,R,E> -> Ev.Input<Nat,Args> -> Sys.Outcome<W.World<S,C,R,E>,Error,Out>,runtime:Route.Runtime<S,C,R,E,F>,reader:Route.Reader<S,Nat,F,take,put>,identified:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Error,Out,runner> & U32) -> Disposal<S,C,R,E,F,Args,Error,Out,take,put,runner>:
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))
43def dispose(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~Args:Type,~Error:Data,~Out:Type,~runner:W.World<S,C,R,E> -> Ev.Input<Nat,Args> -> Sys.Outcome<W.World<S,C,R,E>,Error,Out>,runtime:Route.Runtime<S,C,R,E,F>,reader:Route.Reader<S,Nat,F,take,put>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Error,Out,runner>) -> Disposal<S,C,R,E,F,Args,Error,Out,take,put,runner>:
44 dispose_identified(~S,~C,~R,~E,~F,~take,~put,~Args,~Error,~Out,~runner,runtime,reader,Sys.identity(~S,~C,~R,~E,~Ev.Input<Nat,Args>,~Error,~Out,~runner,registry))
45def selected(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,world:W.World<S,C,R,E>,tick:Nat,returned:F & Stream.Stream<S,Nat>) -> Route.Runtime<S,C,R,E,F> & Stream.Stream<S,Nat>:
46 match returned:
47 case (family,stream):(Route.Runtime{world,family,tick},stream)
48def inspect(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,runtime:Route.Runtime<S,C,R,E,F>) -> Route.Runtime<S,C,R,E,F> & Stream.Stream<S,Nat>:
49 match runtime:
50 case Route.Runtime{world,family,tick}:selected(~S,~C,~R,~E,~F,~take,~put,world,tick,take(family))