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