chunk_shape.bend
bendvy-ecs-core@0.1.0.3 · 26 lines · 7 definitions
1import Base
2import bendvy-ecs-core@0.1.0.3/chunk_column.bend as Col
3import bendvy-ecs-core@0.1.0.3/lifecycle.bend as L
4
5type Shape is Data:
6 Leaf{}
7 Branch{half:U32,left:Shape,right:Shape}
8type Inspection is Data:
9 Inspection{shape:Shape,capacity:U32,valid:Bool}
10
11def inspected_leaf(-S:Data,-C:Type,values:Array<Maybe<&1,C>>,valueSize:U32,result:Array<L.Stamp> & U32) -> Col.Column<S,C> & Inspection:
12 match result:
13 case (stamps,stampSize):(Col.Leaf{values,stamps},Inspection{Leaf{},8,Bool.and(U32.is_eq(valueSize,8),U32.is_eq(stampSize,8))})
14def inspect_values(-S:Data,-C:Type,stamps:Array<L.Stamp>,result:Array<Maybe<&1,C>> & U32) -> Col.Column<S,C> & Inspection:
15 match result:
16 case (values,size):inspected_leaf(S,C,values,size,Array.size(L.Stamp,stamps))
17def inspected_right(-S:Data,-C:Type,+half:U32,left:Col.Column<S,C>,li:Inspection,result:Col.Column<S,C> & Inspection) -> Col.Column<S,C> & Inspection:
18 match li result:
19 case Inspection{ls,+lc,lv}, (right,Inspection{rs,rc,rv}):(Col.Branch{half,left,right},Inspection{Branch{half,ls,rs},U32.add(half,half),Bool.and(lv,Bool.and(rv,Bool.and(U32.is_eq(lc,half),Bool.and(U32.is_eq(rc,half),U32.is_le(half,2147483647)))))})
20def inspected_pair(-S:Data,-C:Type,half:U32,leftResult:Col.Column<S,C> & Inspection,rightResult:Col.Column<S,C> & Inspection) -> Col.Column<S,C> & Inspection:
21 match leftResult:
22 case (left,li):inspected_right(S,C,half,left,li,rightResult)
23def inspect(-S:Data,-C:Type,column:Col.Column<S,C>) -> Col.Column<S,C> & Inspection:
24 match column:
25 case Col.Leaf{values,stamps}:inspect_values(S,C,stamps,Array.size(Maybe<&1,C>,values))
26 case Col.Branch{half,left,right}:inspected_pair(S,C,half,inspect(S,C,left),inspect(S,C,right))