epsilon/src/Main.hs

29 lines
694 B
Haskell

{-# 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 "<stdin>"
[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