workflows.scp (2724B)
1 -- Explicit effect-compose commands; the dispatcher owns return frames. 2 -- convert input: (source, destination); state: injected pure text transformer. 3 consumer convert 4 (source, destination) @ transform => 5 (2, ("copyText", (source, ((transform, destination), ("convertEnd", destination))))) 6 7 consumer convertEnd 8 (stem leaf, (_, _)) @ destination => (0, (stem leaf, (destination, leaf))) 9 (leaf, (problem, metadata)) @ _ => (0, (stem leaf, (("recovered", problem), leaf))) 10 11 -- Remove every CR byte and preserve all other bytes. 12 consumer removeCR 13 [] @ _ => [] 14 [byte | rest] @ _ => choose equal byte 13 recur rest @ leaf [byte | recur rest @ leaf] 15 16 consumer identityText 17 bytes @ _ => bytes 18 19 -- Write identical contents to each runtime-supplied destination in order. 20 -- State: (loop worker, (contents, (reverser worker, reversed completed paths))). 21 -- One external request per item; the resume step tail-delegates with the 22 -- current return stack. An error returns the completed prefix. 23 consumer writeAll 24 [] @ (_, (_, (reverser, completed))) => 25 call reverser completed as paths in (0, (stem leaf, (paths, leaf))) 26 [destination | rest] @ (loop, (contents, (reverser, completed))) => 27 (1, ("WriteBytes", ((destination, contents), ("writeNext", 28 (rest, (destination, (loop, (contents, (reverser, completed))))))))) 29 30 consumer writeNext 31 (stem leaf, (_, _)) @ (rest, (destination, (loop, (contents, (reverser, completed))))) => 32 become loop rest @ (loop, (contents, (reverser, [destination | completed]))) 33 (leaf, (problem, metadata)) @ (_, (destination, (_, (_, (reverser, completed))))) => 34 call reverser completed as paths in (0, (leaf, ((destination, (paths, problem)), metadata))) 35 36 consumer reversePaths 37 [] @ completed => completed 38 [x | rest] @ completed => recur rest @ [x | completed] 39 40 -- Read both files in order and retain the first bytes across the second read. 41 -- Input: (first path, second path); state: injected appendParts worker. 42 consumer readPair 43 (first, second) @ appender => 44 (1, ("ReadBytes", (first, ("pairFirst", (second, appender))))) 45 consumer pairFirst 46 (stem leaf, (contents, _)) @ (second, appender) => 47 (1, ("ReadBytes", (second, ("pairSecond", (contents, appender))))) 48 (leaf, (problem, metadata)) @ _ => (0, (leaf, (("read-first", problem), metadata))) 49 consumer pairSecond 50 (stem leaf, (second, _)) @ (first, appender) => 51 call appender (first, second) as combined in (0, (stem leaf, (combined, leaf))) 52 (leaf, (problem, metadata)) @ _ => (0, (leaf, (("read-second", problem), metadata))) 53 consumer appendParts 54 ([], suffix) @ _ => suffix 55 ([x | rest], suffix) @ _ => [x | recur (rest, suffix) @ leaf]