{-# LANGUAGE
    ConstraintKinds
  , FlexibleContexts
  #-}

module Application.Types where

import LText.Expr (Expr)
import Control.Monad.Reader (MonadReader, ReaderT (runReaderT))
import Control.Monad.Catch (MonadThrow)
import Control.Monad.IO.Class (MonadIO)
import Data.HashSet (HashSet)


-- | More technical shared data
data Env = Env
  { topLevelExpr :: Expr
  , isTypeQuery  :: Bool
  , rawTerms     :: HashSet FilePath
  , delims       :: Maybe (String, String)
  } deriving (Eq, Show)


type MonadApp m =
  ( MonadIO m
  , MonadReader Env m
  , MonadThrow m
  )


type AppM = ReaderT Env IO

runAppM :: Env -> AppM a -> IO a
runAppM = flip runReaderT