blob: 5d4d978eb6271a28aeb242d5c9b957ee43fcf01d (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
-- MIT License, Copyright (c) 2024 Marvin Borner
{-# 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 Language.Mili.Typer ( typeCheck )
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 >>= typeCheck
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")
|