ordinary_owned_event_family_query.bend
bendvy-ecs-core@0.1.0.0 · 38 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.0/world.bend as W
4import bendvy-ecs-core@0.1.0.0/system.bend as Sys
5import bendvy-ecs-core@0.1.0.0/transaction.bend as T
6import bendvy-ecs-core@0.1.0.0/compose.bend as Q
7import bendvy-ecs-core@0.1.0.0/capture_query.bend as Fold
8import bendvy-ecs-core@0.1.0.0/ordinary_query_declaration.bend as Decl
9import bendvy-ecs-core@0.1.0.0/ordinary_system.bend as Ordinary
10import bendvy-ecs-core@0.1.0.0/ordinary_owned_event.bend as Pub
11import bendvy-ecs-core@0.1.0.0/owned_event_journal.bend as Journal
12import bendvy-ecs-core@0.1.0.0/ordinary_owned_event_declaration.bend as Events
13def plan(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>) -> Q.Plan<S,C,R,E,Ops>:
14 Q.Plan{Decl.grant(~S,~Q.Frame<S,C,R,E>,~Ops(Q.Frame<S,C,R,E>),query),Decl.selector(~S,~Q.Frame<S,C,R,E>,~Ops(Q.Frame<S,C,R,E>),query)}
15def row(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World<S,C,R,E>,~Recovery,~EventOps),~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),~H:Type,~caps:Ops(H),stage:Journal.Stage<W.World<S,C,R,E>,Recovery>,args:A,owner:H) -> H & (Journal.Stage<W.World<S,C,R,E>,Recovery> & (T.Outcome<U> & Out)):
16 body(H,caps,Journal.Stage<W.World<S,C,R,E>,Recovery>,Events.root_grant(~S,~W.World<S,C,R,E>,~Recovery,~EventOps,~builder),args,owner,stage)
17type Reply<Error:Data,Out:Type,Recovery:Type> is Type:
18 Reply{outcome:T.Outcome<Error>,output:Out,recovered:Recovery}
19def finished(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~U:Data,~Out:Data,outcome:T.Outcome<Q.Error<U>>,values:List<&2,Out>,result:W.World<S,C,R,E> & Recovery) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>>:
20 match result:
21 case (world,recovered):Sys.Succeeded{world,Reply{outcome,values,recovered}}
22def executing(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~U:Data,~Out:Data,empty:Unit -> Recovery,result:Fold.Executed<W.World<S,C,R,E>,Journal.Stage<W.World<S,C,R,E>,Recovery>,Q.Error<U>,Out>) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>>:
23 match result:
24 case Fold.Executed{world,stage,T.Success{},values}:finished(~S,~C,~R,~E,~Recovery,~U,~Out,T.Success{},values,Journal.finish(~W.World<S,C,R,E>,~Recovery,stage,True{},world,empty(Unit{})))
25 case Fold.Executed{world,stage,T.Failure{error},_}:finished(~S,~C,~R,~E,~Recovery,~U,~Out,T.Failure{error},[],Journal.finish(~W.World<S,C,R,E>,~Recovery,stage,False{},world,empty(Unit{})))
26def runner(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World<S,C,R,E>,~Recovery,~EventOps),~events:Events.Declaration<S,W.World<S,C,R,E>,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),world:W.World<S,C,R,E>,input:A & Maybe<&2,Tick.Tick>) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>>:
27 match input:
28 case (args,cursor):executing(~S,~C,~R,~E,~Recovery,~U,~Out,Events.empty(~S,~W.World<S,C,R,E>,~Recovery,~EventOps,~builder,events),Fold.each_since(~S,~C,~R,~E,~Journal.Stage<W.World<S,C,R,E>,Recovery>,~U,~Out,~Ops,~A,~plan(~S,~C,~R,~E,~Ops,~query),~row(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~Ops,~A,~U,~Out,~body),args,cursor,Journal.empty(~W.World<S,C,R,E>,~Recovery),world))
29def Registry(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World<S,C,R,E>,~Recovery,~EventOps),~events:Events.Declaration<S,W.World<S,C,R,E>,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome<U> & Out))) -> Type:Sys.Registry<S,C,R,E,A & Maybe<&2,Tick.Tick>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>
30def define(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World<S,C,R,E>,~Recovery,~EventOps),~events:Events.Declaration<S,W.World<S,C,R,E>,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),world:W.World<S,C,R,E>,name:String) -> Sys.RegistrationResult<S,C,R,E,A & Maybe<&2,Tick.Tick>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>:
31 Sys.register(~S,~C,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Unit,~Reply<Q.Error<U>,List<&2,Out>,Recovery>,~runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body),world,name,List.append(&2,String,Ordinary.access(~S,Decl.clauses(~S,~Q.Frame<S,C,R,E>,~Ops(Q.Frame<S,C,R,E>),query)),Events.access(~S,~W.World<S,C,R,E>,~Recovery,~EventOps,~builder,events)))
32# Transport is closed and always succeeds. Semantic failure must not advance the
33# ordinary query cursor; the returned receipt remains outside Sys.Failed erasure.
34def run_observed(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World<S,C,R,E>,~Recovery,~EventOps),~events:Events.Declaration<S,W.World<S,C,R,E>,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),world:W.World<S,C,R,E>,args:A,observed:Sys.Registry<S,C,R,E,A & Maybe<&2,Tick.Tick>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)> & Maybe<&2,Tick.Tick>) -> Sys.RunResult<S,C,R,E,A & Maybe<&2,Tick.Tick>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>:
35 match observed:
36 case (registry,cursor):Sys.run(~S,~C,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Unit,~Reply<Q.Error<U>,List<&2,Out>,Recovery>,~runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body),registry,world,(args,cursor))
37def run(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World<S,C,R,E>,~Recovery,~EventOps),~events:Events.Declaration<S,W.World<S,C,R,E>,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),registry:Sys.Registry<S,C,R,E,A & Maybe<&2,Tick.Tick>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>,world:W.World<S,C,R,E>,args:A) -> Sys.RunResult<S,C,R,E,A & Maybe<&2,Tick.Tick>,Unit,Reply<Q.Error<U>,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>:
38 run_observed(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body,world,args,Sys.cursor(~S,~C,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Unit,~Reply<Q.Error<U>,List<&2,Out>,Recovery>,~runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body),registry))