packages feed

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