ordinary_owned_event_query.bend

bendvy-ecs-core@0.1.0.1 · 38 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.1/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.1/world.bend as W
4import bendvy-ecs-core@0.1.0.1/system.bend as Sys
5import bendvy-ecs-core@0.1.0.1/transaction.bend as T
6import bendvy-ecs-core@0.1.0.1/compose.bend as Q
7import bendvy-ecs-core@0.1.0.1/capture_query.bend as Fold
8import bendvy-ecs-core@0.1.0.1/ordinary_query_declaration.bend as Decl
9import bendvy-ecs-core@0.1.0.1/ordinary_system.bend as Ordinary
10import bendvy-ecs-core@0.1.0.1/ordinary_owned_event.bend as Pub
11import bendvy-ecs-core@0.1.0.1/owned_event_storage.bend as Storage
12# Engine-private staged owner, outside the query transaction and its inverses.
13# Ordinary gameplay sees independent abstract H (query) and J (publication).
14type Stage<P:Type> is Type:Stage{newest:List<P>}
15def emit(~P:Type,stage:Stage<P>,payload:P) -> Stage<P>:
16  match stage:
17    case Stage{newest}:Stage{payload <> newest}
18def plan(~S:Data,~C:Type,~R:Type,~P:Type,~identity:Pub.Domain<S,P>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:Pub.Write<S,P,identity,J> -> A -> H -> J -> H & (J & (T.Outcome<U> & Out))) -> Q.Plan<S,C,Storage.Resources<R,P>,Nat,Ops>:
19  Q.Plan{Decl.grant(~S,~Q.Frame<S,C,Storage.Resources<R,P>,Nat>,~Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>),query),Decl.selector(~S,~Q.Frame<S,C,Storage.Resources<R,P>,Nat>,~Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>),query)}
20def row(~S:Data,~C:Type,~R:Type,~P:Type,~identity:Pub.Domain<S,P>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:Pub.Write<S,P,identity,J> -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),~H:Type,~caps:Ops(H),stage:Stage<P>,args:A,owner:H) -> H & (Stage<P> & (T.Outcome<U> & Out)):
21  body(H,caps,Stage<P>,Pub.Write{emit(~P)},args,owner,stage)
22def finished(~S:Data,~C:Type,~R:Type,~P:Type,~U:Data,~Out:Data,result:Fold.Executed<W.World<S,C,Storage.Resources<R,P>,Nat>,Stage<P>,Q.Error<U>,Out>) -> Sys.Outcome<W.World<S,C,Storage.Resources<R,P>,Nat>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>>:
23  match result:
24    case Fold.Executed{world,Stage{newest},T.Success{},values}:Sys.Succeeded{Storage.commit_owned(~S,~C,~R,~P,world,List.reverse(&1,P,newest)),Pub.Reply{T.Success{},values,[]}}
25    case Fold.Executed{world,Stage{newest},T.Failure{error},_}:Sys.Succeeded{world,Pub.Reply{T.Failure{error},[],List.reverse(&1,P,newest)}}
26def runner(~S:Data,~C:Type,~R:Type,~P:Type,~identity:Pub.Domain<S,P>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:Pub.Write<S,P,identity,J> -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),world:W.World<S,C,Storage.Resources<R,P>,Nat>,input:A & Maybe<&2,Tick.Tick>) -> Sys.Outcome<W.World<S,C,Storage.Resources<R,P>,Nat>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>>:
27  match input:
28    case (args,cursor):finished(~S,~C,~R,~P,~U,~Out,Fold.each_since(~S,~C,~Storage.Resources<R,P>,~Nat,~Stage<P>,~U,~Out,~Ops,~A,~plan(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body),~row(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body),args,cursor,Stage{[]},world))
29def Registry(~S:Data,~C:Type,~R:Type,~P:Type,~identity:Pub.Domain<S,P>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:Pub.Write<S,P,identity,J> -> A -> H -> J -> H & (J & (T.Outcome<U> & Out))) -> Type:Sys.Registry<S,C,Storage.Resources<R,P>,Nat,A & Maybe<&2,Tick.Tick>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>,runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body)>
30def define(~S:Data,~C:Type,~R:Type,~P:Type,~identity:Pub.Domain<S,P>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:Pub.Write<S,P,identity,J> -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),world:W.World<S,C,Storage.Resources<R,P>,Nat>,name:String) -> Sys.RegistrationResult<S,C,Storage.Resources<R,P>,Nat,A & Maybe<&2,Tick.Tick>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>,runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body)>:
31  Sys.register(~S,~C,~Storage.Resources<R,P>,~Nat,~(A & Maybe<&2,Tick.Tick>),~Unit,~Pub.Reply<Q.Error<U>,List<&2,Out>,P>,~runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body),world,name,List.append(&2,String,Ordinary.access(~S,Decl.clauses(~S,~Q.Frame<S,C,Storage.Resources<R,P>,Nat>,~Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>),query)),[Pub.access(~S,~P,identity,":write")]))
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,~P:Type,~identity:Pub.Domain<S,P>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:Pub.Write<S,P,identity,J> -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),world:W.World<S,C,Storage.Resources<R,P>,Nat>,args:A,observed:Sys.Registry<S,C,Storage.Resources<R,P>,Nat,A & Maybe<&2,Tick.Tick>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>,runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body)> & Maybe<&2,Tick.Tick>) -> Sys.RunResult<S,C,Storage.Resources<R,P>,Nat,A & Maybe<&2,Tick.Tick>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>,runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body)>:
35  match observed:
36    case (registry,cursor):Sys.run(~S,~C,~Storage.Resources<R,P>,~Nat,~(A & Maybe<&2,Tick.Tick>),~Unit,~Pub.Reply<Q.Error<U>,List<&2,Out>,P>,~runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body),registry,world,(args,cursor))
37def run(~S:Data,~C:Type,~R:Type,~P:Type,~identity:Pub.Domain<S,P>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Ops(Q.Frame<S,C,Storage.Resources<R,P>,Nat>)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:Pub.Write<S,P,identity,J> -> A -> H -> J -> H & (J & (T.Outcome<U> & Out)),registry:Sys.Registry<S,C,Storage.Resources<R,P>,Nat,A & Maybe<&2,Tick.Tick>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>,runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body)>,world:W.World<S,C,Storage.Resources<R,P>,Nat>,args:A) -> Sys.RunResult<S,C,Storage.Resources<R,P>,Nat,A & Maybe<&2,Tick.Tick>,Unit,Pub.Reply<Q.Error<U>,List<&2,Out>,P>,runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body)>:
38  run_observed(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body,world,args,Sys.cursor(~S,~C,~Storage.Resources<R,P>,~Nat,~(A & Maybe<&2,Tick.Tick>),~Unit,~Pub.Reply<Q.Error<U>,List<&2,Out>,P>,~runner(~S,~C,~R,~P,~identity,~Ops,~A,~U,~Out,~query,~body),registry))