hakaru-0.3.0: commands/Simplify.hs
{-# LANGUAGE CPP, OverloadedStrings, DataKinds, GADTs #-}
module Main where
import Language.Hakaru.Pretty.Concrete
import Language.Hakaru.Syntax.AST.Transforms
import Language.Hakaru.Syntax.TypeCheck
import Language.Hakaru.Command (parseAndInfer, readFromFile, Term)
import Language.Hakaru.Simplify
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative (Applicative(..), (<$>))
#endif
import Data.Text
import qualified Data.Text.IO as IO
import System.IO (stderr)
import qualified Options.Applicative as O
data Options = Options
{ debug :: Bool
, program :: String }
options :: O.Parser Options
options = Options
<$> O.switch
( O.long "debug" O.<>
O.help "Prints output that is sent to Maple" )
<*> O.strArgument
( O.metavar "PROGRAM" O.<>
O.help "Program to be simplified" )
parseOpts :: IO Options
parseOpts = O.execParser $ O.info (O.helper <*> options)
(O.fullDesc O.<> O.progDesc "Simplify a hakaru program")
et :: Term a -> Term a
et = expandTransformations
main :: IO ()
main = do
args <- parseOpts
case args of
Options debug_ file -> do
prog <- readFromFile file
runSimplify prog debug_
runSimplify :: Text -> Bool -> IO ()
runSimplify prog debug_ =
case parseAndInfer prog of
Left err -> IO.hPutStrLn stderr err
Right (TypedAST _ ast) -> simplifyDebug debug_ (et ast) >>= print . pretty