packages feed

oplang-0.2.0.0: src/Main.hs

module Main(main) where

import Control.Monad.IO.Class(liftIO)
import Control.Monad.Reader(asks)
import Data.Foldable(traverse_)
import Data.Text(Text)
import Data.Text.IO qualified as T
import System.Exit(exitFailure)

import Control.Monad.Comp(Comp, runComp)
import Data.Opts(getOpts, Opts(..))
import Language.OpLang.Checker(check)
import Language.OpLang.Codegen(compile)
import Language.OpLang.Optimizer(optimize)
import Language.OpLang.Parser(parse)

getCode :: Comp Text
getCode = liftIO . T.readFile =<< asks optsPath

pipeline :: Comp ()
pipeline =
  getCode
  >>= parse
  >>= check
  >>= optimize
  >>= compile

main :: IO ()
main = do
  opts <- getOpts
  (warnings, result) <- runComp opts pipeline

  traverse_ T.putStrLn warnings
  maybe exitFailure pure result