1 import Base 2 import ./ordinary_declaration.bend as Identity 3 import ./persistence_declaration.bend as Decl 4 import ./snapshot_leaf.bend as Leaf 5 import ./decode_data.bend as D 6 import ./component.bend as Cmp 7 import ./column.bend as Col 8 import ./schema_fragments.bend as SF 9 10 # Closed trusted schema lenses, as in existing component.Family. The retained 11 # recipe becomes part of Family's Rest and survives ordinary column operations. 12 def split(~S:Data,~P:Type,~Rest:Type,~identity:Identity.Declaration,~save:P -> P & D.Raw,observed:Rest & Leaf.Component) -> (Rest & Decl.Constructed) & Col.Column: 13 match observed: 14 case (rest,Leaf.Component{column,declaration}):((rest,declaration),column) 15 def take_column(~S:Data,~P:Type,~Store:Type,~Rest:Type,~identity:Identity.Declaration,~save:P -> P & D.Raw,~take:Store -> Rest & Leaf.Component,owner:Store) -> (Rest & Decl.Constructed) & Col.Column: 16 split(~S,~P,~Rest,~identity,~save,take(owner)) 17 def put_column(~S:Data,~P:Type,~Store:Type,~Rest:Type,~identity:Identity.Declaration,~save:P -> P & D.Raw,~put:Rest -> Leaf.Component -> Store,rest:Rest & Decl.Constructed,column:Col.Column) -> Store: 18 match rest: 19 case (rest,declaration):put(rest,Leaf.Component{column,declaration}) 20 def family(~S:Data,~P:Type,~Store:Type,~Rest:Type,~V:Data,~Token:Data,~identity:Identity.Declaration,~save:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Leaf.Component,~put:Rest -> Leaf.Component -> Store) -> Cmp.Family,P,V,Token,take_column(~S,~P,~Store,~Rest,~identity,~save,~take),put_column(~S,~P,~Store,~Rest,~identity,~save,~put),view>: 21 Cmp.Family{Identity.key(~S,~P,identity)} 22 def descriptor(~S:Data,~P:Type,~Token:Data,~identity:Identity.Declaration) -> SF.Descriptor: 23 +key=Identity.key(~S,~P,identity) 24 SF.Descriptor{SF.Component{},key,key}