{-# LANGUAGE BangPatterns #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} module Control.Access.RoleBased.Internal.Types ( module Control.Access.RoleBased.Internal.Role , module Control.Access.RoleBased.Internal.Rule , RoleMonad(..) , RuleChecker(..) ) where ------------------------------------------------------------------------------ import Control.Applicative import Control.Monad.Reader import Control.Monad.Logic ------------------------------------------------------------------------------ import Control.Access.RoleBased.Internal.Role import Control.Access.RoleBased.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)