ordinary_removal_provision.bend
bendvy-ecs-core@0.1.0.1 · 36 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.1/ordinary_declaration.bend as Identity
3import bendvy-ecs-core@0.1.0.1/ordinary_component_binding.bend as Binding
4import bendvy-ecs-core@0.1.0.1/world.bend as W
5import bendvy-ecs-core@0.1.0.1/column.bend as Col
6import bendvy-ecs-core@0.1.0.1/removals.bend as Rm
7
8type Publication<A:Data,B:Data> is Data:
9 Left{value:A}
10 Right{value:B}
11type Selection<S:Data,P:Type,E:Data,-inject:Identity.Declaration<S,P> -> W.Handle<S> -> E,-select:E -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>> is Data:
12 Selection{identity:Identity.Declaration<S,P>}
13def leaf_inject(~S:Data,~P:Type,identity:Identity.Declaration<S,P>,handle:W.Handle<S>) -> Rm.Record<S,Identity.Declaration<S,P>>:
14 Rm.Removed{handle,identity}
15def leaf_select(~S:Data,~P:Type,value:Rm.Record<S,Identity.Declaration<S,P>>) -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>:
16 Some{value}
17def leaf(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~view:P -> P & V,binding:Binding.Binding<S,Store,Rest,P,V,Token,take,put,view>) -> Selection<S,P,Rm.Record<S,Identity.Declaration<S,P>>,leaf_inject(~S,~P),leaf_select(~S,~P)>:
18 Selection{Binding.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding)}
19def left_inject(~S:Data,~P:Type,~A:Data,~B:Data,~inject:Identity.Declaration<S,P> -> W.Handle<S> -> A,identity:Identity.Declaration<S,P>,handle:W.Handle<S>) -> Publication<A,B>:
20 Left{inject(identity,handle)}
21def right_inject(~S:Data,~P:Type,~A:Data,~B:Data,~inject:Identity.Declaration<S,P> -> W.Handle<S> -> B,identity:Identity.Declaration<S,P>,handle:W.Handle<S>) -> Publication<A,B>:
22 Right{inject(identity,handle)}
23def left_select(~S:Data,~P:Type,~A:Data,~B:Data,~select:A -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,value:Publication<A,B>) -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>:
24 match value:
25 case Left{value}:select(value)
26 case Right{_}:None{}
27def right_select(~S:Data,~P:Type,~A:Data,~B:Data,~select:B -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,value:Publication<A,B>) -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>:
28 match value:
29 case Left{_}:None{}
30 case Right{value}:select(value)
31def left(~S:Data,~P:Type,~A:Data,~B:Data,~inject:Identity.Declaration<S,P> -> W.Handle<S> -> A,~select:A -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,value:Selection<S,P,A,inject,select>) -> Selection<S,P,Publication<A,B>,left_inject(~S,~P,~A,~B,~inject),left_select(~S,~P,~A,~B,~select)>:
32 match value:
33 case Selection{identity}:Selection{identity}
34def right(~S:Data,~P:Type,~A:Data,~B:Data,~inject:Identity.Declaration<S,P> -> W.Handle<S> -> B,~select:B -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,value:Selection<S,P,B,inject,select>) -> Selection<S,P,Publication<A,B>,right_inject(~S,~P,~A,~B,~inject),right_select(~S,~P,~A,~B,~select)>:
35 match value:
36 case Selection{identity}:Selection{identity}