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

Plain-text version of layout.hs | Valid HTML?