ordinary_dump_eligibility.bend

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

1import Base
2import entity_key.bend as Key
3import bendvy-ecs-core@0.1.0.0/world.bend as W
4import bendvy-ecs-core@0.1.0.0/schema_fragments.bend as Fragment
5import bendvy-ecs-core@0.1.0.0/ordinary_dump_filter.bend as Filter
6# Presence derives from the ordinary count traversal on one actual alive handle.
7def present_choice(~S:Data,key:String,tail:List<&2,Filter.Value>,absent:Bool) -> List<&2,Filter.Value>:
8  match absent:
9    case True{}:tail
10    case False{}:Filter.Value{key,""} <> tail
11def present(~S:Data,pairs:List<&1,Fragment.Entry<S> & Maybe<&2,U32>>) -> List<&2,Filter.Value>:
12  match pairs:
13    case []:[]
14    case (Fragment.Entry{Fragment.Component{},key,_},Some{count}) <> rest:present_choice(~S,key,present(~S,rest),U32.is_eq(count,0))
15    case _ <> rest:present(~S,rest)
16def kept(~S:Data,~C:Type,handle:W.Handle<S>,result:C & List<&2,W.Handle<S>>) -> C & List<&2,W.Handle<S>>:
17  match result:
18    case (store,after):(store,handle <> after)
19def required(~S:Data,~C:Type,handle:W.Handle<S>,limit:Maybe<&2,Nat>,rest:C -> Maybe<&2,Nat> -> C & List<&2,W.Handle<S>>,store:C,include:Bool) -> C & List<&2,W.Handle<S>>:
20  match include:
21    case True{}:kept(~S,~C,handle,rest(store,Filter.decrement(limit)))
22    case False{}:rest(store,limit)
23def selected(~S:Data,~C:Type,entries:List<&2,Fragment.Entry<S>>,criteria:List<&2,Filter.Component<S>>,handle:W.Handle<S>,limit:Maybe<&2,Nat>,rest:C -> Maybe<&2,Nat> -> C & List<&2,W.Handle<S>>,result:C & List<&2,Maybe<&2,U32>>) -> C & List<&2,W.Handle<S>>:
24  match result:
25    case (store,slots):required(~S,~C,handle,limit,rest,store,Filter.requirements(~S,criteria,present(~S,List.zip(&2,Fragment.Entry<S>,&2,Maybe<&2,U32>,Fragment.bare_entries(~S,entries),slots))))
26def included(~S:Data,~C:Type,~count:C -> List<&2,W.Handle<S>> -> C & List<&2,Maybe<&2,U32>>,entries:List<&2,Fragment.Entry<S>>,criteria:List<&2,Filter.Component<S>>,+handle:W.Handle<S>,limit:Maybe<&2,Nat>,rest:C -> Maybe<&2,Nat> -> C & List<&2,W.Handle<S>>,store:C,include:Bool) -> C & List<&2,W.Handle<S>>:
27  match include:
28    case False{}:rest(store,limit)
29    case True{}:selected(~S,~C,entries,criteria,handle,limit,rest,count(store,[handle]))
30def scan(~S:Data,~C:Type,~count:C -> List<&2,W.Handle<S>> -> C & List<&2,Maybe<&2,U32>>,handles:List<&2,W.Handle<S>>,+entries:List<&2,Fragment.Entry<S>>,+ids:Maybe<&2,List<&2,Key.Key>>,+criteria:List<&2,Filter.Component<S>>,limit:Maybe<&2,Nat>,store:C) -> C & List<&2,W.Handle<S>>:
31  match handles limit:
32    case _ Some{0n}:(store,[])
33    case [] _:(store,[])
34    case +handle <> rest limit:included(~S,~C,~count,entries,criteria,handle,limit,next => remaining => scan(~S,~C,~count,rest,entries,ids,criteria,remaining,next),store,Filter.includes(~S,ids,handle))