{-# 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
  { Env -> Expr
topLevelExpr :: Expr
  , Env -> Bool
isTypeQuery  :: Bool
  , Env -> HashSet FilePath
rawTerms     :: HashSet FilePath
  , Env -> Maybe (FilePath, FilePath)
delims       :: Maybe (String, String)
  } deriving (Env -> Env -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Env -> Env -> Bool
$c/= :: Env -> Env -> Bool
== :: Env -> Env -> Bool
$c== :: Env -> Env -> Bool
Eq, Int -> Env -> ShowS
[Env] -> ShowS
Env -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [Env] -> ShowS
$cshowList :: [Env] -> ShowS
show :: Env -> FilePath
$cshow :: Env -> FilePath
showsPrec :: Int -> Env -> ShowS
$cshowsPrec :: Int -> Env -> ShowS
Show)


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


type AppM = ReaderT Env IO

runAppM :: Env -> AppM a -> IO a
runAppM :: forall a. Env -> AppM a -> IO a
runAppM = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT