tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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]