hakaru-0.6.0: commands/PrettyInternal.hs
{-# LANGUAGE OverloadedStrings, DataKinds, GADTs, CPP, RecordWildCards #-}
module Main where
import Language.Hakaru.Syntax.AST.Transforms
import Language.Hakaru.Syntax.TypeCheck
import Language.Hakaru.Command
import qualified Data.Text as T
import qualified Data.Text.Utf8 as IO
import System.IO (stderr)
import Data.Monoid
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative (Applicative(..), (<$>), (<*>))
#endif
import qualified Options.Applicative as O
data Options = Options
{ printType :: Bool
, program :: FilePath
}
options :: O.Parser Options
options = Options
<$> O.switch
( O.short 't' <>
O.long "print-type" <>
O.help "Print the type of the program as well." )
<*> O.strArgument
( O.metavar "PROGRAM" <>
O.help "Filename containing program to be printed, or \"-\" to read from input." )
parseOpts :: IO Options
parseOpts = O.execParser $ O.info (O.helper <*> options)
(O.fullDesc <> O.progDesc "Parse, typecheck, and print (in internal syntax) a Hakaru program")
main :: IO ()
main = parseOpts >>= runPretty
runPretty :: Options -> IO ()
runPretty Options{..} = readFromFile' program >>= parseAndInfer' >>= \prog ->
case prog of
Left err -> IO.hPutStrLn stderr err
Right (TypedAST ty ast) -> IO.putStrLn $
-- TODO: prettier (than `show') printing of internal syntax
(if printType then \x ->
T.concat [ "(", x, ")"
, "\n.\n" <> T.pack (show ty) ]
else id)
(T.pack $ show $ expandTransformations ast)