recognized_system.bend

bendvy-ecs-core@0.1.0.1 · 54 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/recognized_query_declaration.bend as N
4import bendvy-ecs-core@0.1.0.1/internal/compact_operational_frame.bend as F
5import bendvy-ecs-core@0.1.0.1/ordinary_query_declaration.bend as Decl
6import bendvy-ecs-core@0.1.0.1/ordinary_system.bend as Ordinary
7import bendvy-ecs-core@0.1.0.1/compose.bend as Q
8import bendvy-ecs-core@0.1.0.1/transaction.bend as T
9import bendvy-ecs-core@0.1.0.1/world.bend as W
10import bendvy-ecs-core@0.1.0.1/system.bend as Sys
11import bendvy-ecs-core@0.1.0.1/capabilities.bend as Cap
12
13# Registry ownership and final transaction semantics remain ordinary. The closed
14# recognized carrier supplies operations for this concrete, smaller owner.
15def target(~S:Data,~Store:Type,~R:Type,~E:Data,handle:W.Handle<S>,frame:F.Frame<S,Store,R,E>) -> F.Frame<S,Store,R,E>:
16  match frame:
17    case F.Frame{namespace,allocator,store,_,_,cursor,shell}:F.Frame{namespace,allocator,store,handle,None{},cursor,shell}
18def row_completed(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,frame:F.Frame<S,Store,R,E>,value:Out,status:T.Outcome<Q.Error<U>>) -> F.Frame<S,Store,R,E> & Q.RowResult<U,Out>:
19  match status:
20    case T.Success{}:(frame,Q.Passed{value})
21    case T.Failure{error}:(frame,Q.Failed{error})
22def body_returned(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,observed:F.Frame<S,Store,R,E> & (T.Outcome<U> & Out)) -> F.Frame<S,Store,R,E> & Q.RowResult<U,Out>:
23  match observed:
24    case (F.Frame{namespace,allocator,store,handle,+error,cursor,shell},(user,value)):row_completed(~S,~Store,~R,~E,~U,~Out,F.Frame{namespace,allocator,store,handle,error,cursor,shell},value,Q.outcome(~U,error,user))
25def selected(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration<S,Store,R,E,Ops>,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome<U> & Out),args:A,observed:F.Frame<S,Store,R,E> & Bool) -> F.Frame<S,Store,R,E> & Q.RowResult<U,Out>:
26  match observed:
27    case (frame,False{}):(frame,Q.Skipped{})
28    case (frame,True{}):body_returned(~S,~Store,~R,~E,~U,~Out,Cap.invoke(~Ops,~A,~(T.Outcome<U> & Out),~body,~F.Frame<S,Store,R,E>,~N.caps(~S,~Store,~R,~E,~Ops,query),args,frame))
29def run_handles(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration<S,Store,R,E,Ops>,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome<U> & Out),handles:List<&2,W.Handle<S>>,+args:A,values:List<&2,Out>,observed:F.Frame<S,Store,R,E> & Q.RowResult<U,Out>) -> F.Frame<S,Store,R,E> & (T.Outcome<Q.Error<U>> & List<&2,Out>):
30  match handles observed:
31    case _ Tuple{frame,Q.Failed{error}}:(frame,(T.Failure{error},List.reverse(&2,Out,values)))
32    case Nil{} Tuple{frame,Q.Skipped{}}:(frame,(T.Success{},List.reverse(&2,Out,values)))
33    case Nil{} Tuple{frame,Q.Passed{value}}:(frame,(T.Success{},List.reverse(&2,Out,value <> values)))
34    case Con{handle,rest} Tuple{frame,Q.Skipped{}}:run_handles(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,rest,args,values,selected(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,N.selector(~S,~Store,~R,~E,~Ops,query)(target(~S,~Store,~R,~E,handle,frame))))
35    case Con{handle,rest} Tuple{frame,Q.Passed{value}}:run_handles(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,rest,args,value <> values,selected(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,N.selector(~S,~Store,~R,~E,~Ops,query)(target(~S,~Store,~R,~E,handle,frame))))
36def finish_frame(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,result:T.Outcome<Q.Error<U>> & List<&2,Out>,frame:Q.Frame<S,Store,R,E>) -> Q.Executed<W.World<S,Store,R,E>,Q.Error<U>,Out>:
37  match frame:
38    case Q.Frame{tx,_,_,_}:Q.finished(~S,~Store,~R,~E,~U,~Out,(tx,result))
39def finished(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,observed:F.Frame<S,Store,R,E> & (T.Outcome<Q.Error<U>> & List<&2,Out>)) -> Q.Executed<W.World<S,Store,R,E>,Q.Error<U>,Out>:
40  match observed:
41    case (frame,result):finish_frame(~S,~Store,~R,~E,~U,~Out,result,F.restore(~S,~Store,~R,~E,frame))
42def reserved(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration<S,Store,R,E,Ops>,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome<U> & Out),+args:A,cursor:Maybe<&2,Tick.Tick>,observed:W.World<S,Store,R,E> & List<&2,W.Handle<S>>) -> Q.Executed<W.World<S,Store,R,E>,Q.Error<U>,Out>:
43  match observed:
44    case (world,[]):Q.finished(~S,~Store,~R,~E,~U,~Out,(T.begin(~W.World<S,Store,R,E>,~E,world),(T.Success{},[])))
45    case (world,+handle <> rest):finished(~S,~Store,~R,~E,~U,~Out,run_handles(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,rest,args,[],selected(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,N.selector(~S,~Store,~R,~E,~Ops,query)(F.extract(~S,~Store,~R,~E,Q.Frame{T.begin(~W.World<S,Store,R,E>,~E,world),handle,None{},cursor})))))
46def runner(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration<S,Store,R,E,Ops>,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome<U> & Out),world:W.World<S,Store,R,E>,args:A & Maybe<&2,Tick.Tick>) -> Sys.Outcome<W.World<S,Store,R,E>,Q.Error<U>,List<&2,Out>>:
47  match args:
48    case (args,cursor):Ordinary.completed(~S,~Store,~R,~E,~U,~Out,reserved(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,cursor,W.handles(~S,~Store,~R,~E,world)))
49def registered(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration<S,Store,R,E,Ops>,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome<U> & Out),slot:String,clauses:List<&2,Decl.Clause<S>>,result:Sys.RegistrationResult<S,Store,R,E,A & Maybe<&2,Tick.Tick>,Q.Error<U>,List<&2,Out>,runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body)>) -> Ordinary.Defined<S,W.World<S,Store,R,E>,Sys.Registry<S,Store,R,E,A & Maybe<&2,Tick.Tick>,Q.Error<U>,List<&2,Out>,runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body)>>:
50  match result:
51    case Sys.RegistrationFailed{world}:Ordinary.Rejected{world}
52    case Sys.Registered{world,registry}:Ordinary.Defined{world,Ordinary.Owner{registry,slot,clauses}}
53def define(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration<S,Store,R,E,Ops>,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome<U> & Out),world:W.World<S,Store,R,E>,name:String,slot:String) -> Ordinary.Defined<S,W.World<S,Store,R,E>,Sys.Registry<S,Store,R,E,A & Maybe<&2,Tick.Tick>,Q.Error<U>,List<&2,Out>,runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body)>>:
54  registered(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,slot,Decl.clauses(~S,~Q.Frame<S,Store,R,E>,~Ops(Q.Frame<S,Store,R,E>),N.ordinary(~S,~Store,~R,~E,~Ops,query)),Sys.register(~S,~Store,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Q.Error<U>,~List<&2,Out>,~runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body),world,name,Ordinary.access(~S,Decl.clauses(~S,~Q.Frame<S,Store,R,E>,~Ops(Q.Frame<S,Store,R,E>),N.ordinary(~S,~Store,~R,~E,~Ops,query)))))