HaRe-0.6: tools/hsutils/layout.hs
import System(getArgs)
import Unlit(readHaskellFile)
import L(l)
import HsLexerPass1
import HsLayoutPre(layoutPre)
import List(partition)
-- This version reads the Haskell input from files named on the command line.
main = mapM_ doLayout =<< getArgs
doLayout path = putStrLn . layout =<< readHaskellFile path
layout =
concatMap tokenString .
uncurry (mergeBy (cmpBy tokenPos)) .
apFst (flip l [] . layoutPre) .
partition (notWhite.fst) .
lexerPass0
where
tokenPos = fst . snd
tokenString = snd . snd
--- Utilities
apFst f (x,y) = (f x,y)
cmpBy f x y = f x `compare` f y
mergeBy cmp [] ys = ys
mergeBy cmp xs [] = xs
mergeBy cmp a@(x:xs) b@(y:ys) =
case x `cmp` y of
GT -> y : mergeBy cmp a ys
_ -> x : mergeBy cmp xs b