{-# LANGUAGE BangPatterns #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} module Data.RBAC.Internal.Types ( module Data.RBAC.Internal.Role , module Data.RBAC.Internal.Rule , RoleMonad(..) , RuleChecker(..) ) where import Control.Applicative import Control.Monad.Reader import Control.Monad.Logic import Data.RBAC.Internal.Role import Data.RBAC.Internal.Rule ------------------------------------------------------------------------------ -- TODO: should the monads be transformers here? If they were, you could check -- more complex predicates here ------------------------------------------------------------------------------ newtype RoleMonad a = RoleMonad { _unRC :: Logic a } deriving (Alternative, Applicative, Functor, Monad, MonadPlus, MonadLogic) ------------------------------------------------------------------------------ newtype RuleChecker a = RuleChecker (ReaderT (RoleMonad Role) RoleMonad a) deriving (Alternative, Applicative, Functor, Monad, MonadPlus, MonadLogic)