From f60b209eae598160f6cf160415e08ae72658cd32 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Wed, 13 Nov 2024 16:18:01 +0100 Subject: Initial structure --- app/Main.hs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 app/Main.hs (limited to 'app/Main.hs') 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") -- cgit v1.2.3