{-# LANGUAGE LambdaCase #-} module Main where import Control.Monad.Trans.Except (runExceptT) import Data.Text (Text) import qualified Data.Text.IO as T import System.Environment (getArgs) import Language.Epsilon.Parser (parse) import Language.Epsilon.Types (runEvalM) import Language.Epsilon.Eval (eval) main :: IO () main = getArgs >>= \case [] -> T.getContents >>= go "" [x] -> T.readFile x >>= go x _ -> putStrLn "not sure what to do with these cli args" go :: FilePath -> Text -> IO () go fp s = case parse fp s of Left pe -> print pe Right ast -> do runExceptT (runEvalM $ eval ast) >>= \case Left e -> print e Right res -> print res