aboutsummaryrefslogtreecommitdiff
path: root/app/Main.hs
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")