-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | A simple environment to control access to data
--
-- This is a small capability-based interface to check legitimacy of
-- accesses in different parts of the program depending on the context in
-- which the data is accessed. See the README.md in the repository for a
-- longer explanation and an example.
@package safe-access
@version 0.3.2.1
module Control.SafeAccess
-- | Allow things to be accessed. See ensureAccess.
--
-- d is the type describing an access.
newtype Capability m d
MkCapability :: (d -> m AccessDecision) -> Capability m d
[runCapability] :: Capability m d -> d -> m AccessDecision
type Capabilities m d = [Capability m d]
-- | Control the decision process.
--
-- The constructors are ordered by prevalence. For instance, if two
-- capabilities respectively return AccessGranted and
-- AccessDenied, the final decision will be AccessDenied.
data AccessDecision
-- | No but another Capability can still decide to grant
AccessDeniedSoft :: AccessDecision
-- | Final yes (see explanation)
AccessGranted :: AccessDecision
-- | Final no
AccessDenied :: AccessDecision
-- | A simple monad transformer to ensure that data are accessed
-- legitimately.
--
-- The return value is either the description of an access having been
-- denied (left) or the result of the normal computation (right).
newtype SafeAccessT d m a
SafeAccessT :: (Capabilities m d -> m (Either d a)) -> SafeAccessT d m a
[runSafeAccessT] :: SafeAccessT d m a -> Capabilities m d -> m (Either d a)
class (Monad m, Monad s) => MonadSafeAccess d m s | m -> s, m -> d
getCapabilities :: MonadSafeAccess d m s => m (Capabilities s d)
liftSub :: MonadSafeAccess d m s => s a -> m a
denyAccess :: MonadSafeAccess d m s => d -> m ()
-- | Check that the access is legal or make the monad "fail".
ensureAccess :: MonadSafeAccess d m s => d -> m ()
-- | Allow certain accesses regardless of the capabilities. (unsecure!)
unsecureAllow :: (Monad m, Eq d) => [d] -> SafeAccessT d m a -> SafeAccessT d m a
-- | Create a capability which only allows a given access
singleCapability :: (Applicative f, Eq d) => d -> Capability f d
-- | Create a capability which only allows given accesses
someCapabilities :: (Applicative f, Eq d) => [d] -> Capability f d
-- | A special capability which allows every access. Be careful with this!
passthroughCapability :: Applicative f => Capability f d
-- | Lift an action from ErrorT to SafeAccessT.
liftExceptT :: ExceptT d m a -> SafeAccessT d m a
liftCapability :: (Monad m, MonadTrans t) => Capability m d -> Capability (t m) d
instance GHC.Classes.Eq Control.SafeAccess.AccessDecision
instance GHC.Show.Show Control.SafeAccess.AccessDecision
instance GHC.Base.Applicative m => GHC.Base.Monoid (Control.SafeAccess.Capability m d)
instance GHC.Base.Monoid Control.SafeAccess.AccessDecision
instance GHC.Base.Functor f => GHC.Base.Functor (Control.SafeAccess.SafeAccessT d f)
instance GHC.Base.Applicative f => GHC.Base.Applicative (Control.SafeAccess.SafeAccessT d f)
instance GHC.Base.Monad m => GHC.Base.Monad (Control.SafeAccess.SafeAccessT d m)
instance Control.Monad.Trans.Class.MonadTrans (Control.SafeAccess.SafeAccessT d)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.SafeAccess.SafeAccessT d m)
instance GHC.Base.Monad m => Control.SafeAccess.MonadSafeAccess d (Control.SafeAccess.SafeAccessT d m) m
instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (Control.SafeAccess.SafeAccessT d m)
instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Control.SafeAccess.SafeAccessT d m)
instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Control.SafeAccess.SafeAccessT d m)
instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (Control.SafeAccess.SafeAccessT d m)
instance Control.SafeAccess.MonadSafeAccess d m s => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.Cont.ContT e m) s
instance Control.SafeAccess.MonadSafeAccess d m s => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.Except.ExceptT e m) s
instance Control.SafeAccess.MonadSafeAccess d m s => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.Identity.IdentityT m) s
instance Control.SafeAccess.MonadSafeAccess d m s => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.List.ListT m) s
instance Control.SafeAccess.MonadSafeAccess d m s => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.Maybe.MaybeT m) s
instance Control.SafeAccess.MonadSafeAccess d m s => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.Reader.ReaderT r m) s
instance (Control.SafeAccess.MonadSafeAccess d m s, GHC.Base.Monoid w) => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.RWS.Lazy.RWST r w st m) s
instance (Control.SafeAccess.MonadSafeAccess d m s, GHC.Base.Monoid w) => Control.SafeAccess.MonadSafeAccess d (Control.Monad.Trans.Writer.Lazy.WriterT w m) s