consumer_split_lines.tri (2140B)
1 -- LF splitting uses reusable reverse/fold/prepend, never an eager snoc. 2 !import "consumers.base-source" B 3 !import "consumers.structural" S 4 !import "consumers.lexical-worker" L 5 !import "prelude" !Local 6 !import "io" !Local 7 8 load name = do onOk_ 9 text <- readFile (append "lib/consumer/" (append name ".scp")) 10 pure (matchResult (_ _ : err "source parse failure" t) 11 (named _ : ok (snd named) t) (B.compileBaseSource text)) 12 worker program initial = S.makeConsumer initial (snd program) 13 checks splitter reverser folder prepender = 14 let refPrepend = worker prepender t in 15 let lexPrepend = resultOr t (L.lCompile refPrepend) in 16 let refFold = worker folder t in 17 let lexFold = resultOr t (L.lCompile refFold) in 18 let refReverse = worker reverser (pair refFold refPrepend) in 19 let lexReverse = resultOr t (L.lCompile 20 (worker reverser (pair lexFold lexPrepend))) in 21 let refSplit = worker splitter (pair [] refReverse) in 22 let lexSplit = resultOr t (L.lCompile 23 (worker splitter (pair [] lexReverse))) in 24 let same source expected = (and? 25 (equal? (S.runConsumer refSplit source) (ok expected t)) 26 (equal? (L.lRunChecked lexSplit source) (ok expected t))) in 27 foldl and? true [ 28 (resultIsOk (L.lCompile refPrepend)) 29 (resultIsOk (L.lCompile refFold)) 30 (resultIsOk (L.lCompile (worker reverser (pair lexFold lexPrepend)))) 31 (resultIsOk (L.lCompile (worker splitter (pair [] lexReverse)))) 32 (same "" []) 33 (same "a" ["a"]) 34 (same "\n" [""]) 35 (same "a\n" ["a"]) 36 (same "a\n\n" ["a" ""]) 37 (same "a\nb" ["a" "b"]) 38 (same "\r\n" ["\r"]) 39 (same "a\r\nb\n" ["a\r" "b"]) 40 (equal? (S.runConsumer refSplit (t t)) 41 (err "no matching consumer rule" t)) 42 (equal? (L.lRunChecked lexSplit (t t)) 43 (err "no matching consumer rule" t))] 44 stage = do onOk_ 45 splitter <- load "text/splitLines" 46 reverser <- load "reverse" 47 folder <- load "fold" 48 prepender <- load "prepend" 49 pure (ok (checks splitter reverser folder prepender) t) 50 main = io (onResult_ stage 51 (_ : putStrLn "split-lines-load-fail") 52 (passed : putStrLn (matchBool "split-lines-ok" "split-lines-DIFFER" passed))) 53 main