ordinary_removal_provision.bend

bendvy-ecs-core@0.1.0.0 · 36 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.0/ordinary_declaration.bend as Identity
3import bendvy-ecs-core@0.1.0.0/ordinary_component_binding.bend as Binding
4import bendvy-ecs-core@0.1.0.0/world.bend as W
5import bendvy-ecs-core@0.1.0.0/column.bend as Col
6import bendvy-ecs-core@0.1.0.0/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}