diff options
Diffstat (limited to 'app/Main.hs')
-rw-r--r-- | app/Main.hs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..b0a3aca --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,45 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Main + ( main + ) where + +import Data.Mili ( Term(..) ) +import qualified Data.Text as T +import Language.Mili.Analyzer ( linearity ) +import Language.Mili.Parser ( parseProgram ) +import Language.Mili.Reducer ( nf ) +import Options.Applicative ( (<**>) + , Parser + , execParser + , fullDesc + , header + , helper + , info + ) + +data ArgMode = ArgEval + +newtype Args = Args + { _argMode :: ArgMode + } + +args :: Parser Args +args = pure $ Args ArgEval + +pipeline :: T.Text -> Either String Term +pipeline program = parseProgram program >>= linearity + +actions :: Args -> IO () +actions Args { _argMode = ArgEval } = do + program <- getContents + case pipeline (T.pack program) of + Left err -> putStrLn err + Right out -> + let term = show out + normal = show $ nf out + in putStrLn $ term <> "\n" <> normal + +main :: IO () +main = execParser opts >>= actions + where opts = info (args <**> helper) (fullDesc <> header "bruijn but linear") |