1 import Base 2 import entity_key.bend as Key 3 import ./world.bend as W 4 import ./schema_fragments.bend as Fragment 5 import ./ordinary_dump_filter.bend as Filter 6 # Selected handles only reach this stage. Entries remain the sole schema key list. 7 def components(~S:Data,pairs:List<&1,Fragment.Entry & Maybe<&2,String>>) -> List<&2,Filter.Value>: 8 match pairs: 9 case []:[] 10 case (Fragment.Entry{Fragment.Component{},key,_},Some{text}) <> rest:Filter.Value{key,text} <> components(~S,rest) 11 case _ <> rest:components(~S,rest) 12 def resources(~S:Data,pairs:List<&1,Fragment.Entry & Maybe<&2,String>>) -> List<&2,Filter.Value>: 13 match pairs: 14 case []:[] 15 case (Fragment.Entry{Fragment.Resource{},key,_},Some{text}) <> rest:Filter.Value{key,text} <> resources(~S,rest) 16 case _ <> rest:resources(~S,rest) 17 def finished(~S:Data,~C:Type,row:Filter.Row,result:C & List<&2,Filter.Row>) -> C & List<&2,Filter.Row>: 18 match result: 19 case (store,rows):(store,row <> rows) 20 def rendered(~S:Data,~C:Type,entries:List<&2,Fragment.Entry>,handle:W.Handle,rest:C -> C & List<&2,Filter.Row>,result:C & List<&2,Maybe<&2,String>>) -> C & List<&2,Filter.Row>: 21 match result: 22 case (store,slots):finished(~S,~C,Filter.Row{handle,components(~S,List.zip(&2,Fragment.Entry,&2,Maybe<&2,String>,Fragment.bare_entries(~S,entries),slots))},rest(store)) 23 def rows(~S:Data,~C:Type,~read:C -> U32 -> C & List<&2,Maybe<&2,String>>,handles:List<&2,W.Handle>,+entries:List<&2,Fragment.Entry>,store:C) -> C & List<&2,Filter.Row>: 24 match handles: 25 case []:(store,[]) 26 case W.Handle{+namespace,+id} <> rest:rendered(~S,~C,entries,W.Handle{namespace,id},next => rows(~S,~C,~read,rest,entries,next),read(store,Key.index(id)))