ordinary_dump_render.bend
bendvy-ecs-core@0.1.0.1 · 26 lines · 0 definitions
1import Base
2import entity_key.bend as Key
3import bendvy-ecs-core@0.1.0.1/world.bend as W
4import bendvy-ecs-core@0.1.0.1/schema_fragments.bend as Fragment
5import bendvy-ecs-core@0.1.0.1/ordinary_dump_filter.bend as Filter
6# Selected handles only reach this stage. Entries remain the sole schema key list.
7def components(~S:Data,pairs:List<&1,Fragment.Entry<S> & 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)
12def resources(~S:Data,pairs:List<&1,Fragment.Entry<S> & 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)
17def finished(~S:Data,~C:Type,row:Filter.Row<S>,result:C & List<&2,Filter.Row<S>>) -> C & List<&2,Filter.Row<S>>:
18 match result:
19 case (store,rows):(store,row <> rows)
20def rendered(~S:Data,~C:Type,entries:List<&2,Fragment.Entry<S>>,handle:W.Handle<S>,rest:C -> C & List<&2,Filter.Row<S>>,result:C & List<&2,Maybe<&2,String>>) -> C & List<&2,Filter.Row<S>>:
21 match result:
22 case (store,slots):finished(~S,~C,Filter.Row{handle,components(~S,List.zip(&2,Fragment.Entry<S>,&2,Maybe<&2,String>,Fragment.bare_entries(~S,entries),slots))},rest(store))
23def rows(~S:Data,~C:Type,~read:C -> U32 -> C & List<&2,Maybe<&2,String>>,handles:List<&2,W.Handle<S>>,+entries:List<&2,Fragment.Entry<S>>,store:C) -> C & List<&2,Filter.Row<S>>:
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)))