module Language.Lambda.SystemF (
  Globals(),
  evalText,

  module Language.Lambda.SystemF.Expression,
  module Language.Lambda.SystemF.Parser,
  module Language.Lambda.SystemF.State
  ) where

import Control.Monad.Except
import RIO
import qualified RIO.Text as Text
import qualified Data.Map as Map

import Language.Lambda.Shared.Errors
import Language.Lambda.SystemF.Expression
import Language.Lambda.SystemF.Parser
import Language.Lambda.SystemF.State

type Globals = Map.Map String (SystemFExpr String String)

evalText :: Text -> Typecheck Text (SystemFExpr Text Text)
evalText :: Text -> Typecheck Text (SystemFExpr Text Text)
evalText Text
text = case Text -> Either ParseError (SystemFExpr Text Text)
parseExpr Text
text of
  Left ParseError
err -> LambdaException -> Typecheck Text (SystemFExpr Text Text)
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (LambdaException -> Typecheck Text (SystemFExpr Text Text))
-> LambdaException -> Typecheck Text (SystemFExpr Text Text)
forall a b. (a -> b) -> a -> b
$ Text -> LambdaException
ParseError (Text -> LambdaException) -> Text -> LambdaException
forall a b. (a -> b) -> a -> b
$ String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ ParseError -> String
forall a. Show a => a -> String
show ParseError
err
  Right SystemFExpr Text Text
res -> SystemFExpr Text Text -> Typecheck Text (SystemFExpr Text Text)
forall (m :: * -> *) a. Monad m => a -> m a
return SystemFExpr Text Text
res