{-# LANGUAGE Rank2Types #-}
module Lambdabot.Parser
( withParsed
, prettyPrintInLine
) where
import Data.Generics
import Language.Haskell.Exts.Simple
withParsed :: (forall a. (Data a, Eq a) => a -> a) -> String -> Either String String
withParsed _ "" = Left "Error: expected a Haskell expression or declaration"
withParsed f s = case (parseExp s, parseDecl s) of
(ParseOk a, _) -> Right $ prettyPrintInLine $ f a
(_, ParseOk a) -> Right $ prettyPrintInLine $ f a
(ParseFailed l e, _) -> Left $ prettyPrint l ++ ':' : e
prettyPrintInLine :: Pretty a => a -> String
prettyPrintInLine = prettyPrintWithMode (defaultMode { layout = PPInLine })