countLines.scp (769B)
1 !export countLines 2 -- Count LF-delimited lines in a byte list (LF is byte 10). 3 -- Initial state: (0, (leaf, successor)); count is an ordinary compact 4 -- tricu number. Supply the SCP-authored succ consumer to the reference 5 -- oracle or its compiled worker to lexical execution. Pending is 6 -- stem leaf after non-LF content and leaf immediately after LF. A final 7 -- unterminated line counts once; a trailing LF adds no extra line. 8 consumer countLines 9 [] @ (count, (pending, successor)) => choose equal pending leaf count 10 call successor count as next in next 11 [byte | rest] @ (count, (pending, successor)) => choose equal byte 10 12 call successor count as next in recur rest @ (next, (leaf, successor)) 13 recur rest @ (count, (stem leaf, successor))