Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
- newtype Capability m d = MkCapability {
- runCapability :: d -> m AccessDecision
- type Capabilities m d = [Capability m d]
- data AccessDecision
- newtype SafeAccessT d m a = SafeAccessT {
- runSafeAccessT :: Capabilities m d -> m (Either d a)
- class (Monad m, Monad s) => MonadSafeAccess d m s | m -> s, m -> d where
- ensureAccess :: MonadSafeAccess d m s => d -> m ()
- unsecureAllow :: (Monad m, Eq d) => [d] -> SafeAccessT d m a -> SafeAccessT d m a
- singleCapability :: (Applicative f, Eq d) => d -> Capability f d
- someCapabilities :: (Applicative f, Eq d) => [d] -> Capability f d
- passthroughCapability :: Applicative f => Capability f d
- liftExceptT :: ExceptT d m a -> SafeAccessT d m a
- liftCapability :: (Monad m, MonadTrans t) => Capability m d -> Capability (t m) d
Documentation
newtype Capability m d Source #
Allow things to be accessed. See ensureAccess
.
d
is the type describing an access.
MkCapability | |
|
Applicative m => Monoid (Capability m d) Source # | |
type Capabilities m d = [Capability m d] Source #
data AccessDecision Source #
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
.
AccessDeniedSoft | No but another |
AccessGranted | Final yes (see explanation) |
AccessDenied | Final no |
newtype SafeAccessT d m a Source #
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).
SafeAccessT | |
|
MonadError e m => MonadError e (SafeAccessT d m) Source # | |
MonadReader r m => MonadReader r (SafeAccessT d m) Source # | |
MonadState s m => MonadState s (SafeAccessT d m) Source # | |
MonadWriter w m => MonadWriter w (SafeAccessT d m) Source # | |
Monad m => MonadSafeAccess d (SafeAccessT d m) m Source # | |
MonadTrans (SafeAccessT d) Source # | |
Monad m => Monad (SafeAccessT d m) Source # | |
Functor f => Functor (SafeAccessT d f) Source # | |
Applicative f => Applicative (SafeAccessT d f) Source # | |
MonadIO m => MonadIO (SafeAccessT d m) Source # | |
class (Monad m, Monad s) => MonadSafeAccess d m s | m -> s, m -> d where Source #
getCapabilities :: m (Capabilities s d) Source #
liftSub :: s a -> m a Source #
denyAccess :: d -> m () Source #
catchAccessError :: m a -> (d -> m a) -> m a Source #
Catch an access error, i.e. an access descriptor which resulted into an access denied given the capabilities.
MonadSafeAccess d m s => MonadSafeAccess d (MaybeT m) s Source # | |
MonadSafeAccess d m s => MonadSafeAccess d (ListT m) s Source # | |
(MonadSafeAccess d m s, Monoid w) => MonadSafeAccess d (WriterT w m) s Source # | |
MonadSafeAccess d m s => MonadSafeAccess d (IdentityT * m) s Source # | |
MonadSafeAccess d m s => MonadSafeAccess d (ExceptT e m) s Source # | |
Monad m => MonadSafeAccess d (SafeAccessT d m) m Source # | |
MonadSafeAccess d m s => MonadSafeAccess d (ReaderT * r m) s Source # | |
MonadSafeAccess d m s => MonadSafeAccess d (ContT * e m) s Source # | |
(MonadSafeAccess d m s, Monoid w) => MonadSafeAccess d (RWST r w st m) s Source # | |
ensureAccess :: MonadSafeAccess d m s => d -> m () Source #
Check that the access is legal or make the monad "fail".
unsecureAllow :: (Monad m, Eq d) => [d] -> SafeAccessT d m a -> SafeAccessT d m a Source #
Allow certain accesses regardless of the capabilities. (unsecure!)
singleCapability :: (Applicative f, Eq d) => d -> Capability f d Source #
Create a capability which only allows a given access
someCapabilities :: (Applicative f, Eq d) => [d] -> Capability f d Source #
Create a capability which only allows given accesses
passthroughCapability :: Applicative f => Capability f d Source #
A special capability which allows every access. Be careful with this!
liftExceptT :: ExceptT d m a -> SafeAccessT d m a Source #
Lift an action from ErrorT
to SafeAccessT
.
liftCapability :: (Monad m, MonadTrans t) => Capability m d -> Capability (t m) d Source #