scoped-codensity-0.1.0.0: CPS resource allocation but as a Monad and completely safe
Safe HaskellSafe-Inferred
LanguageHaskell2010

Control.Monad.Scoped.Internal

Description

Internal module for Scoped, ScopedResource & co.

Only import this if you need to wrap an otherwise some still interface around resources

Synopsis

definitions of Scoped and ScopedResource and functions to work with them

newtype Scoped s m a Source #

The Scoped monad that provides the possibility to safely scope the allocation of a resource

It is used to abstract over all of the CPS style withSomething functions, like withFile

Be sure to properly mask handlers if you are using UnsafeMkScoped. Use safe helper functions like registerHandler or bracketScoped where possible.

Constructors

UnsafeMkScoped 

Fields

  • unsafeRunScoped :: forall b. (a -> m b) -> m b

    Unsafely runs a scoped block. use scoped instead, otherwise resources might escape

Instances

Instances details
MonadTrans (Scoped s :: (Type -> Type) -> Type -> Type) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Methods

lift :: Monad m => m a -> Scoped s m a #

MonadFail m => MonadFail (Scoped s m) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Methods

fail :: String -> Scoped s m a #

MonadIO m => MonadIO (Scoped s m) Source #

You can perform IO in a scoped block, but it does not inherit its safety guarantees

Instance details

Defined in Control.Monad.Scoped.Internal

Methods

liftIO :: IO a -> Scoped s m a #

Alternative m => Alternative (Scoped s m) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Methods

empty :: Scoped s m a #

(<|>) :: Scoped s m a -> Scoped s m a -> Scoped s m a #

some :: Scoped s m a -> Scoped s m [a] #

many :: Scoped s m a -> Scoped s m [a] #

Applicative (Scoped s m) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Methods

pure :: a -> Scoped s m a #

(<*>) :: Scoped s m (a -> b) -> Scoped s m a -> Scoped s m b #

liftA2 :: (a -> b -> c) -> Scoped s m a -> Scoped s m b -> Scoped s m c #

(*>) :: Scoped s m a -> Scoped s m b -> Scoped s m b #

(<*) :: Scoped s m a -> Scoped s m b -> Scoped s m a #

Functor (Scoped s m) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Methods

fmap :: (a -> b) -> Scoped s m a -> Scoped s m b #

(<$) :: a -> Scoped s m b -> Scoped s m a #

Monad (Scoped s m) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Methods

(>>=) :: Scoped s m a -> (a -> Scoped s m b) -> Scoped s m b #

(>>) :: Scoped s m a -> Scoped s m b -> Scoped s m b #

return :: a -> Scoped s m a #

Alternative m => MonadPlus (Scoped s m) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Methods

mzero :: Scoped s m a #

mplus :: Scoped s m a -> Scoped s m a -> Scoped s m a #

newtype ScopedResource s a Source #

A scoped resource with token s belonging to a Scoped block with the same token.

If you are creating a ScopedResource, make sure the resource is deallocated properly when the Scoped block is exited.

Constructors

UnsafeMkScopedResource 

Fields

  • unsafeUnwrapScopedResource :: a

    Unsafely runs a scoped resource. It forgets the scope of the resource and may now be escaped incorrectly

Instances

Instances details
Show a => Show (ScopedResource s a) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Eq a => Eq (ScopedResource s a) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

Ord a => Ord (ScopedResource s a) Source # 
Instance details

Defined in Control.Monad.Scoped.Internal

scoped Source #

Arguments

:: forall m a. Applicative m 
=> (forall s. Scoped s m a)

the scoped computation to be run

-> m a 

Run a Scoped block safely, making sure that none of the safely allocated resources can escape it, using the same trick as ST

All of the allocated resources will live until the end of the block is reached

registerHandler Source #

Arguments

:: MonadUnliftIO m 
=> m a

the handler to be registered

-> Scoped s m () 

Run a handler masked for async exception when the Scoped block ends

You can register a handler wherever in your Scoped block you want, but it will nonetheless be run in reverse order that the handlers have been registered, after the scoped block's actions have been finished

Helpers to create your own Scoped wrappers around resources

bracketScoped Source #

Arguments

:: MonadUnliftIO m 
=> m a

an action that allocates a resource of type a

-> (a -> m b)

an action that deallocates a resource of type a

-> Scoped s m (ScopedResource s a) 

A wrapper around bracket to allocate a resource safely in a Scoped block

It returns a ScopedResource that belongs to the Scoped block it was allocated in