execution_query_column.bend

bendvy-ecs-core@0.1.0.3 · 65 lines · 17 definitions

1import Base
2import bendvy-ecs-core@0.1.0.3/chunk_column.bend as Col
3import bendvy-ecs-core@0.1.0.3/chunk_shape.bend as Part
4import bendvy-ecs-core@0.1.0.3/execution_composer_layout.bend as L
5import bendvy-ecs-core@0.1.0.3/change_tick.bend as Tick
6import bendvy-ecs-core@0.1.0.3/lifecycle.bend as Life
7import bendvy-ecs-core@0.1.0.3/execution_effects.bend as E
8
9type Edit<-S:Data,-C:Type,-P:Type,-Out:Type> is Type:
10  Edited{column:Col.Column<S,C>,output:Out}
11  Unchanged{column:Col.Column<S,C>,unused:P -> P & Out}
12
13type Update<-S:Data,-C:Type,-O:Type> is Type:
14  Updated{column:Col.Column<S,C>,state:O,changed:Bool}
15
16def updated(~S:Data,~layout:L.Layout,~route:L.Route,-O:Type,values:Array<Maybe<&1,L.stored(layout,route)>>,stamps:Array<Life.Stamp>,+index:U32,tick:Tick.Tick,result:L.stored(layout,route) & O) -> Update<S,L.stored(layout,route),O>:
17  match result:
18    case (owner,state):Updated{Col.Leaf{Array.set(Maybe<&1,L.stored(layout,route)>,values,index,Some{owner}),Col.edit_stamps(stamps,index,tick,True{})},state,True{}}
19def effect_rewritten(~S:Data,~layout:L.Layout,~route:L.Route,-O:Type,values:Array<Maybe<&1,L.stored(layout,route)>>,stamps:Array<Life.Stamp>,index:U32,tick:Tick.Tick,result:L.payload(layout,route) & O) -> Update<S,L.stored(layout,route),O>:
20  updated(~S,~layout,~route,O,values,stamps,index,tick,L.rewritten(L.payload(layout,route),L.stored(layout,route),O,L.initialize(layout,route),result))
21def effect_taken(~S:Data,~F:Type -> Type,~effects:E.Effects<F>,~layout:L.Layout,~route:L.Route,-O:Type,stamps:Array<Life.Stamp>,index:U32,tick:Tick.Tick,state:O,operation:L.payload(layout,route) -> O -> F(L.payload(layout,route) & O),result:Array<Maybe<&1,L.stored(layout,route)>> & Maybe<&1,L.stored(layout,route)>) -> F(Update<S,L.stored(layout,route),O>):
22  match result:
23    case (values,None{}):E.pure(~F,Update<S,L.stored(layout,route),O>,effects,Updated{Col.Leaf{values,stamps},state,False{}})
24    case (values,Some{L.Viewed{payload,_}}):E.map(~F,L.payload(layout,route) & O,Update<S,L.stored(layout,route),O>,effects,operation(payload,state),result=>effect_rewritten(~S,~layout,~route,O,values,stamps,index,tick,result))
25def effect_left(-S:Data,-C:Type,-O:Type,half:U32,right:Col.Column<S,C>,result:Update<S,C,O>) -> Update<S,C,O>:
26  match result:
27    case Updated{left,state,changed}:Updated{Col.Branch{half,left,right},state,changed}
28def effect_right(-S:Data,-C:Type,-O:Type,half:U32,left:Col.Column<S,C>,result:Update<S,C,O>) -> Update<S,C,O>:
29  match result:
30    case Updated{right,state,changed}:Updated{Col.Branch{half,left,right},state,changed}
31def effect_branch(~F:Type -> Type,~effects:E.Effects<F>,-S:Data,-C:Type,-P:Type,-O:Type,+half:U32,left:Col.Column<S,C>,right:Col.Column<S,C>,goLeft:Col.Column<S,C> -> O -> (P -> O -> F(P & O)) -> F(Update<S,C,O>),goRight:Col.Column<S,C> -> O -> (P -> O -> F(P & O)) -> F(Update<S,C,O>),state:O,operation:P -> O -> F(P & O),first:Bool) -> F(Update<S,C,O>):
32  match first:
33    case True{}:E.map(~F,Update<S,C,O>,Update<S,C,O>,effects,goLeft(left,state,operation),result=>effect_left(S,C,O,half,right,result))
34    case False{}:E.map(~F,Update<S,C,O>,Update<S,C,O>,effects,goRight(right,state,operation),result=>effect_right(S,C,O,half,left,result))
35def effect_tree(~S:Data,~F:Type -> Type,~effects:E.Effects<F>,~layout:L.Layout,~route:L.Route,-O:Type,shape:Part.Shape,column:Col.Column<S,L.stored(layout,route)>,+index:U32,+tick:Tick.Tick,state:O,operation:L.payload(layout,route) -> O -> F(L.payload(layout,route) & O)) -> F(Update<S,L.stored(layout,route),O>):
36  match shape column:
37    case Part.Leaf{} Col.Leaf{values,stamps}:effect_taken(~S,~F,~effects,~layout,~route,O,stamps,index,tick,state,operation,Array.swap(Maybe<&1,L.stored(layout,route)>,values,index,None{}))
38    case Part.Branch{+half,leftShape,rightShape} Col.Branch{_,left,right}:effect_branch(~F,~effects,S,L.stored(layout,route),L.payload(layout,route),O,half,left,right,(column=>state=>operation=>effect_tree(~S,~F,~effects,~layout,~route,O,leftShape,column,index,tick,state,operation)),(column=>state=>operation=>effect_tree(~S,~F,~effects,~layout,~route,O,rightShape,column,U32.sub(index,half),tick,state,operation)),state,operation,U32.is_lt(index,half))
39    case _ column:E.pure(~F,Update<S,L.stored(layout,route),O>,effects,Updated{column,state,False{}})
40def effect_checked(~S:Data,~F:Type -> Type,~effects:E.Effects<F>,~layout:L.Layout,~route:L.Route,-O:Type,shape:Part.Shape,column:Col.Column<S,L.stored(layout,route)>,index:U32,tick:Tick.Tick,state:O,operation:L.payload(layout,route) -> O -> F(L.payload(layout,route) & O),valid:Bool) -> F(Update<S,L.stored(layout,route),O>):
41  match valid:
42    case False{}:E.pure(~F,Update<S,L.stored(layout,route),O>,effects,Updated{column,state,False{}})
43    case True{}:effect_tree(~S,~F,~effects,~layout,~route,O,shape,column,index,tick,state,operation)
44def effect_inspected(~S:Data,~F:Type -> Type,~effects:E.Effects<F>,~layout:L.Layout,~route:L.Route,-O:Type,+index:U32,tick:Tick.Tick,state:O,operation:L.payload(layout,route) -> O -> F(L.payload(layout,route) & O),result:Col.Column<S,L.stored(layout,route)> & Part.Inspection) -> F(Update<S,L.stored(layout,route),O>):
45  match result:
46    case (column,Part.Inspection{shape,capacity,valid}):effect_checked(~S,~F,~effects,~layout,~route,O,shape,column,index,tick,state,operation,Bool.and(valid,U32.is_lt(index,capacity)))
47def effect_edit(~S:Data,~F:Type -> Type,~effects:E.Effects<F>,~layout:L.Layout,~route:L.Route,-O:Type,column:Col.Column<S,L.stored(layout,route)>,index:U32,tick:Tick.Tick,state:O,operation:L.payload(layout,route) -> O -> F(L.payload(layout,route) & O)) -> F(Update<S,L.stored(layout,route),O>):
48  effect_inspected(~S,~F,~effects,~layout,~route,O,index,tick,state,operation,Part.inspect(S,L.stored(layout,route),column))
49
50type PureUpdate<-P:Type,-Out:Type> is Type:
51  PendingUpdate{transform:P -> P & Out}
52  FinishedUpdate{output:Out}
53def pure_transformed(-P:Type,-Out:Type,result:P & Out) -> P & PureUpdate<P,Out>:
54  match result:
55    case (payload,output):(payload,FinishedUpdate{output})
56def pure_operation(-P:Type,-Out:Type,payload:P,state:PureUpdate<P,Out>) -> P & PureUpdate<P,Out>:
57  match state:
58    case PendingUpdate{transform}:pure_transformed(P,Out,transform(payload))
59    case FinishedUpdate{output}:(payload,FinishedUpdate{output})
60def pure_returned(-S:Data,-C:Type,-P:Type,-Out:Type,result:Update<S,C,PureUpdate<P,Out>>) -> Edit<S,C,P,Out>:
61  match result:
62    case Updated{column,PendingUpdate{transform},_}:Unchanged{column,transform}
63    case Updated{column,FinishedUpdate{output},_}:Edited{column,output}
64def edit(~S:Data,~layout:L.Layout,~route:L.Route,-Out:Type,column:Col.Column<S,L.stored(layout,route)>,index:U32,tick:Tick.Tick,transform:L.payload(layout,route) -> L.payload(layout,route) & Out) -> Edit<S,L.stored(layout,route),L.payload(layout,route),Out>:
65  pure_returned(S,L.stored(layout,route),L.payload(layout,route),Out,effect_edit(~S,~E.Identity,~E.identity(),~layout,~route,PureUpdate<L.payload(layout,route),Out>,column,index,tick,PendingUpdate{transform},pure_operation(L.payload(layout,route),Out)))