module Language.GroteTrap.Unparse (
Unparse(..),
merge, over
) where
import Language.GroteTrap.Range
import Language.GroteTrap.ParseTree
class Unparse p where
unparse :: p -> String
instance Unparse ParseTree where
unparse = foldParseTree $ ParseTreeAlg
( \pos name -> indent pos name )
( \pos value -> indent pos $ show value )
unparseUnary
unparseBinary
unparseNary
unparseCall
unparseParens
indent :: Pos -> String -> String
indent n s = replicate n ' ' ++ s
unparseUnary :: Range -> String -> String -> String
unparseUnary (begin, _) op sub = indent begin op `over` sub
unparseBinary :: Range -> String -> String -> String -> String
unparseBinary (begin, _) op left right = left `over` indent begin op `over` right
unparseNary :: Bool -> [Range] -> String -> [String] -> String
unparseNary _ ranges op children = foldl over "" children `over` foldl over "" (map place ranges)
where place (begin, _) = indent begin op
unparseParens :: Range -> String -> String
unparseParens (begin, end) sub = indent begin "(" `over` sub `over` indent (end 1) ")"
unparseCall = error "Whoops! Not implemented"
over :: String -> String -> String
over over' under = take n $ zipWith f (pad over') (pad under)
where f ' ' b = b
f a _ = a
pad str = str ++ repeat ' '
n = length over' `max` length under
merge :: [String] -> String
merge = foldr over ""