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))