1 import Base 2 import ./chunk_column.bend as Col 3 import ./lifecycle.bend as L 4 5 type Shape is Data: 6 Leaf{} 7 Branch{half:U32,left:Shape,right:Shape} 8 type Inspection is Data: 9 Inspection{shape:Shape,capacity:U32,valid:Bool} 10 11 def inspected_leaf(-S:Data,-C:Type,values:Array>,valueSize:U32,result:Array & U32) -> Col.Column & 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))}) 14 def inspect_values(-S:Data,-C:Type,stamps:Array,result:Array> & U32) -> Col.Column & Inspection: 15 match result: 16 case (values,size):inspected_leaf(S,C,values,size,Array.size(L.Stamp,stamps)) 17 def inspected_right(-S:Data,-C:Type,+half:U32,left:Col.Column,li:Inspection,result:Col.Column & Inspection) -> Col.Column & 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)))))}) 20 def inspected_pair(-S:Data,-C:Type,half:U32,leftResult:Col.Column & Inspection,rightResult:Col.Column & Inspection) -> Col.Column & Inspection: 21 match leftResult: 22 case (left,li):inspected_right(S,C,half,left,li,rightResult) 23 def inspect(-S:Data,-C:Type,column:Col.Column) -> Col.Column & 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))