countLines-fast.scp (1003B)
1 -- Focused experiment: inline up to two no-carry bits before calling successor. 2 -- Unshipped: duplicated arithmetic increases build/bundle size. 3 consumer countLines 4 [] @ (count, (pending, successor)) => choose equal pending leaf count 5 match count of ( 6 leaf => 1 7 | (leaf, higher) => (stem leaf, higher) 8 | (stem leaf, leaf) => 2 9 | (stem leaf, (leaf, higher)) => (leaf, (stem leaf, higher)) 10 | _ => call successor count as next in next) 11 [byte | rest] @ (count, (pending, successor)) => choose equal byte 10 12 match count of ( 13 leaf => recur rest @ (1, (leaf, successor)) 14 | (leaf, higher) => recur rest @ ((stem leaf, higher), (leaf, successor)) 15 | (stem leaf, leaf) => recur rest @ (2, (leaf, successor)) 16 | (stem leaf, (leaf, higher)) => recur rest @ ((leaf, (stem leaf, higher)), (leaf, successor)) 17 | _ => call successor count as next in recur rest @ (next, (leaf, successor))) 18 recur rest @ (count, (stem leaf, successor))