Safe Haskell  None 

Language  Haskell2010 
Shpadoinkle Continuation is the abstract structure of Shpadoinkle's event handling system. It allows for asynchronous effects in event handlers by providing a model for atomic updates of application state.
Synopsis
 data Continuation m a
 = Continuation (a > a) (a > m (Continuation m a))
  Rollback (Continuation m a)
  Merge (Continuation m a)
  Pure (a > a)
 runContinuation :: Monad m => Continuation m a > a > m (a > a)
 done :: Continuation m a
 pur :: (a > a) > Continuation m a
 impur :: Applicative m => m (a > a) > Continuation m a
 kleisli :: (a > m (Continuation m a)) > Continuation m a
 causes :: Applicative m => m () > Continuation m a
 causedBy :: m (Continuation m a) > Continuation m a
 merge :: Continuation m a > Continuation m a
 contIso :: Functor m => (a > b) > (b > a) > Continuation m a > Continuation m b
 before :: Applicative m => Continuation m a > Continuation m a > Continuation m a
 after :: Applicative m => Continuation m a > Continuation m a > Continuation m a
 class Continuous f where
 mapC :: (Continuation m a > Continuation m b) > f m a > f m b
 hoist :: Functor m => (forall b. m b > n b) > Continuation m a > Continuation n a
 voidC' :: Monad m => Continuation m () > Continuation m a
 voidC :: Monad m => Continuous f => f m () > f m a
 forgetC :: Continuous f => f m a > f m b
 liftC' :: Functor m => (a > b > b) > (b > a) > Continuation m a > Continuation m b
 liftCMay' :: Applicative m => (a > b > b) > (b > Maybe a) > Continuation m a > Continuation m b
 liftC :: Functor m => Continuous f => (a > b > b) > (b > a) > f m a > f m b
 liftCMay :: Applicative m => Continuous f => (a > b > b) > (b > Maybe a) > f m a > f m b
 leftC' :: Functor m => Continuation m a > Continuation m (a, b)
 leftC :: Functor m => Continuous f => f m a > f m (a, b)
 rightC' :: Functor m => Continuation m b > Continuation m (a, b)
 rightC :: Functor m => Continuous f => f m b > f m (a, b)
 eitherC' :: Applicative m => Continuation m a > Continuation m b > Continuation m (Either a b)
 eitherC :: Applicative m => Continuous f => (a > f m a) > (b > f m b) > Either a b > f m (Either a b)
 maybeC' :: Applicative m => Continuation m a > Continuation m (Maybe a)
 maybeC :: Applicative m => Continuous f => f m a > f m (Maybe a)
 comaybe :: (Maybe a > Maybe a) > a > a
 comaybeC' :: Functor m => Continuation m (Maybe a) > Continuation m a
 comaybeC :: Functor m => Continuous f => f m (Maybe a) > f m a
 writeUpdate :: MonadUnliftIO m => NFData a => TVar a > Continuation m a > m ()
 shouldUpdate :: forall a b m. MonadJSM m => MonadUnliftIO m => Eq a => (b > a > m b) > b > TVar a > m ()
 constUpdate :: a > Continuation m a
 newtype ContinuationT model m a = ContinuationT {
 runContinuationT :: m (a, Continuation m model)
 voidRunContinuationT :: Functor m => ContinuationT model m a > Continuation m model
 kleisliT :: Applicative m => (model > ContinuationT model m a) > Continuation m model
 commit :: Applicative m => Continuation m model > ContinuationT model m ()
 class NFData a where
 rnf :: a > ()
 force :: NFData a => a > a
The Continuation Type
data Continuation m a Source #
A Continuation builds up an atomic state update incrementally in a series of stages. For each stage we perform a monadic IO computation and we may get a pure state updating function. When all of the stages have been executed we are left with a composition of the resulting pure state updating functions, and this composition is applied atomically to the state.
Additionally, a Continuation stage may feature a Rollback action which cancels all state updates generated so far but allows for further state updates to be generated based on further monadic IO computation.
The functions generating each stage of the Continuation are called with states which reflect the current state of the app, with all the pure state updating functions generated so far having been applied to it, so that each stage "sees" both the current state (even if it changed since the start of computing the Continuation), and the updates made so far, although those updates are not committed to the real state until the Continuation finishes and they are all done atomically together.
Continuation (a > a) (a > m (Continuation m a))  
Rollback (Continuation m a)  
Merge (Continuation m a)  
Pure (a > a) 
Instances
Continuous Continuation Source #  
Defined in Shpadoinkle.Continuation mapC :: forall (m :: Type > Type) a b. (Continuation m a > Continuation m b) > Continuation m a > Continuation m b Source #  
Applicative m => Functor EndoIso EndoIso (Continuation m :: Type > Type) Source # 

Defined in Shpadoinkle.Continuation map :: forall (a :: α) (b :: α). EndoIso a b > EndoIso (Continuation m a) (Continuation m b) #  
Applicative m => Semigroup (Continuation m a) Source #  You can combine multiple Continuations homogeneously using the 
Defined in Shpadoinkle.Continuation (<>) :: Continuation m a > Continuation m a > Continuation m a # sconcat :: NonEmpty (Continuation m a) > Continuation m a # stimes :: Integral b => b > Continuation m a > Continuation m a #  
Applicative m => Monoid (Continuation m a) Source #  Since combining Continuations homogeneously is an associative operation,
and this operation has a unit element (done), Continuations are a 
Defined in Shpadoinkle.Continuation mempty :: Continuation m a # mappend :: Continuation m a > Continuation m a > Continuation m a # mconcat :: [Continuation m a] > Continuation m a # 
runContinuation :: Monad m => Continuation m a > a > m (a > a) Source #
runContinuation
takes a Continuation
and a state value and runs the whole Continuation
as if the real state was frozen at the value given to runContinuation
. It performs all the
IO actions in the stages of the Continuation and returns a pure state updating function
which is the composition of all the pure state updating functions generated by the
nonrolledback stages of the Continuation. If you are trying to update a Continuous
territory, then you should probably be using writeUpdate
instead of runContinuation
,
because writeUpdate
will allow each stage of the Continuation to see any extant updates
made to the territory after the Continuation started running.
done :: Continuation m a Source #
A Continuation which doesn't touch the state and doesn't have any side effects
pur :: (a > a) > Continuation m a Source #
A pure state updating function can be turned into a Continuation. This function is here so that users of the Continuation API can do basic things without needing to depend on the internal structure of the type.
impur :: Applicative m => m (a > a) > Continuation m a Source #
A monadic computation of a pure state updating function can be turned into a Continuation.
kleisli :: (a > m (Continuation m a)) > Continuation m a Source #
This turns a Kleisli arrow for computing a Continuation into the Continuation which reads the state, runs the monadic computation specified by the arrow on that state, and runs the resulting Continuation.
causes :: Applicative m => m () > Continuation m a Source #
A monadic computation can be turned into a Continuation which does not touch the state.
causedBy :: m (Continuation m a) > Continuation m a Source #
merge :: Continuation m a > Continuation m a Source #
A continuation can be forced to write its changes midflight.
contIso :: Functor m => (a > b) > (b > a) > Continuation m a > Continuation m b Source #
Transform the type of a Continuation using an isomorphism.
before :: Applicative m => Continuation m a > Continuation m a > Continuation m a Source #
Sequences two continuations one after the other.
after :: Applicative m => Continuation m a > Continuation m a > Continuation m a Source #
The Class
class Continuous f where Source #
f
is a Functor to Hask from the category where the objects are
Continuation types and the morphisms are functions.
mapC :: (Continuation m a > Continuation m b) > f m a > f m b Source #
Instances
Continuous Continuation Source #  
Defined in Shpadoinkle.Continuation mapC :: forall (m :: Type > Type) a b. (Continuation m a > Continuation m b) > Continuation m a > Continuation m b Source #  
Continuous Props Source #  Given a lens, you can change the type of a Props by using the lens to convert the types of the Continuations inside. 
Defined in Shpadoinkle.Core mapC :: forall (m :: Type > Type) a b. (Continuation m a > Continuation m b) > Props m a > Props m b Source #  
Continuous Prop Source #  Given a lens, you can change the type of a Prop by using the lens to convert the types of the Continuations which it contains if it is a listener. 
Defined in Shpadoinkle.Core mapC :: forall (m :: Type > Type) a b. (Continuation m a > Continuation m b) > Prop m a > Prop m b Source #  
Continuous Html Source #  Given a lens, you can change the type of an Html by using the lens to convert the types of the Continuations inside it. 
Defined in Shpadoinkle.Core mapC :: forall (m :: Type > Type) a b. (Continuation m a > Continuation m b) > Html m a > Html m b Source # 
Hoist
hoist :: Functor m => (forall b. m b > n b) > Continuation m a > Continuation n a Source #
Given a natural transformation, change a Continuation's underlying functor.
Forgetting
voidC' :: Monad m => Continuation m () > Continuation m a Source #
Change a void continuation into any other type of Continuation.
voidC :: Monad m => Continuous f => f m () > f m a Source #
Change the type of the fembedded void Continuations into any other type of Continuation.
forgetC :: Continuous f => f m a > f m b Source #
Forget about the Continuations.
Lifts
liftC' :: Functor m => (a > b > b) > (b > a) > Continuation m a > Continuation m b Source #
Apply a lens inside a Continuation to change the Continuation's type.
liftCMay' :: Applicative m => (a > b > b) > (b > Maybe a) > Continuation m a > Continuation m b Source #
Apply a traversal inside a Continuation to change the Continuation's type.
liftC :: Functor m => Continuous f => (a > b > b) > (b > a) > f m a > f m b Source #
Given a lens, change the value type of f
by applying the lens in the Continuations inside f
.
liftCMay :: Applicative m => Continuous f => (a > b > b) > (b > Maybe a) > f m a > f m b Source #
Given a traversal, change the value of f
by apply the traversal in the Continuations inside f
.
Utilities
Product
leftC' :: Functor m => Continuation m a > Continuation m (a, b) Source #
leftC :: Functor m => Continuous f => f m a > f m (a, b) Source #
Change the type of f
by applying the Continuations inside f
to the left coordinate of a tuple.
rightC' :: Functor m => Continuation m b > Continuation m (a, b) Source #
Change the type of a Continuation by applying it to the right coordinate of a tuple.
rightC :: Functor m => Continuous f => f m b > f m (a, b) Source #
Change the value type of f
by applying the Continuations inside f
to the right coordinate of a tuple.
Coproduct
eitherC' :: Applicative m => Continuation m a > Continuation m b > Continuation m (Either a b) Source #
Combine Continuations heterogeneously into coproduct Continuations. The first value the Continuation sees determines which of the two input Continuation branches it follows. If the coproduct Continuation sees the state change to a different Eitherbranch, then it cancels itself. If the state is in a different Eitherbranch when the Continuation completes than it was when the Continuation started, then the coproduct Continuation will have no effect on the state.
eitherC :: Applicative m => Continuous f => (a > f m a) > (b > f m b) > Either a b > f m (Either a b) Source #
Create a structure containing coproduct Continuations using two case alternatives which generate structures containing Continuations of the types inside the coproduct. The Continuations in the resulting structure will only have effect on the state while it is in the branch of the coproduct selected by the input value used to create the structure.
Maybe
maybeC' :: Applicative m => Continuation m a > Continuation m (Maybe a) Source #
maybeC :: Applicative m => Continuous f => f m a > f m (Maybe a) Source #
Change the value type of f
by transforming the Continuations inside f
to work on Maybe
s using maybeC'.
comaybe :: (Maybe a > Maybe a) > a > a Source #
Turn a Maybe a
updating function into an a
updating function which acts as
the identity function when the input function outputs Nothing
.
comaybeC' :: Functor m => Continuation m (Maybe a) > Continuation m a Source #
Change the type of a Maybevalued Continuation into the Maybewrapped type.
The resulting Continuation acts like the input Continuation except that
when the input Continuation would replace the current value with Nothing
,
instead the current value is retained.
comaybeC :: Functor m => Continuous f => f m (Maybe a) > f m a Source #
Transform the Continuations inside f
using comaybeC'.
Updates
writeUpdate :: MonadUnliftIO m => NFData a => TVar a > Continuation m a > m () Source #
Run a Continuation on a state variable. This may update the state. This is a synchronous, nonblocking operation for pure updates, and an asynchronous, nonblocking operation for impure updates.
shouldUpdate :: forall a b m. MonadJSM m => MonadUnliftIO m => Eq a => (b > a > m b) > b > TVar a > m () Source #
Execute a fold by watching a state variable and executing the next step of the fold each time it changes.
constUpdate :: a > Continuation m a Source #
Create an update to a constant value.
Monad Transformer
newtype ContinuationT model m a Source #
A monad transformer for building up a Continuation in a series of steps in a monadic computation
ContinuationT  

Instances
voidRunContinuationT :: Functor m => ContinuationT model m a > Continuation m model Source #
This turns a monadic computation to build up a Continuation into the Continuation which it represents. The actions inside the monadic computation will be run when the Continuation is run. The return value of the monadic computation will be discarded.
kleisliT :: Applicative m => (model > ContinuationT model m a) > Continuation m model Source #
This turns a function for building a Continuation in a monadic computation which is parameterized by the current state of the model into a Continuation which reads the current state of the model, runs the resulting monadic computation, and runs the Continuation resulting from that computation.
commit :: Applicative m => Continuation m model > ContinuationT model m () Source #
This adds the given Continuation to the Continuation being built up in the monadic context where this function is invoked.
Reexports
A class of types that can be fully evaluated.
Since: deepseq1.1.0.0
Nothing
rnf
should reduce its argument to normal form (that is, fully
evaluate all subcomponents), and then return ()
.
Generic
NFData
deriving
Starting with GHC 7.2, you can automatically derive instances
for types possessing a Generic
instance.
Note: Generic1
can be autoderived starting with GHC 7.4
{# LANGUAGE DeriveGeneric #} import GHC.Generics (Generic, Generic1) import Control.DeepSeq data Foo a = Foo a String deriving (Eq, Generic, Generic1) instance NFData a => NFData (Foo a) instance NFData1 Foo data Colour = Red  Green  Blue deriving Generic instance NFData Colour
Starting with GHC 7.10, the example above can be written more
concisely by enabling the new DeriveAnyClass
extension:
{# LANGUAGE DeriveGeneric, DeriveAnyClass #} import GHC.Generics (Generic) import Control.DeepSeq data Foo a = Foo a String deriving (Eq, Generic, Generic1, NFData, NFData1) data Colour = Red  Green  Blue deriving (Generic, NFData)
Compatibility with previous deepseq
versions
Prior to version 1.4.0.0, the default implementation of the rnf
method was defined as
rnf
a =seq
a ()
However, starting with deepseq1.4.0.0
, the default
implementation is based on DefaultSignatures
allowing for
more accurate autoderived NFData
instances. If you need the
previously used exact default rnf
method implementation
semantics, use
instance NFData Colour where rnf x = seq x ()
or alternatively
instance NFData Colour where rnf = rwhnf
or
{# LANGUAGE BangPatterns #} instance NFData Colour where rnf !_ = ()
Instances
NFData Bool  
Defined in Control.DeepSeq  
NFData Char  
Defined in Control.DeepSeq  
NFData Double  
Defined in Control.DeepSeq  
NFData Float  
Defined in Control.DeepSeq  
NFData Int  
Defined in Control.DeepSeq  
NFData Int8  
Defined in Control.DeepSeq  
NFData Int16  
Defined in Control.DeepSeq  
NFData Int32  
Defined in Control.DeepSeq  
NFData Int64  
Defined in Control.DeepSeq  
NFData Integer  
Defined in Control.DeepSeq  
NFData Natural  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData Ordering  
Defined in Control.DeepSeq  
NFData Word  
Defined in Control.DeepSeq  
NFData Word8  
Defined in Control.DeepSeq  
NFData Word16  
Defined in Control.DeepSeq  
NFData Word32  
Defined in Control.DeepSeq  
NFData Word64  
Defined in Control.DeepSeq  
NFData CallStack  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData ()  
Defined in Control.DeepSeq  
NFData TyCon  NOTE: Prior to Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData ByteString  
Defined in Data.ByteString.Internal rnf :: ByteString > () #  
NFData Scientific  
Defined in Data.Scientific rnf :: Scientific > () #  
NFData JSONPathElement  
Defined in Data.Aeson.Types.Internal rnf :: JSONPathElement > () #  
NFData Value  
Defined in Data.Aeson.Types.Internal  
NFData ThreadId  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData Void  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData Unique  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData Version  Since: deepseq1.3.0.0 
Defined in Control.DeepSeq  
NFData ExitCode  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData MaskingState  Since: deepseq1.4.4.0 
Defined in Control.DeepSeq rnf :: MaskingState > () #  
NFData TypeRep  NOTE: Prior to Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData All  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData Any  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CChar  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CSChar  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CUChar  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CShort  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CUShort  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CInt  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CUInt  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CLong  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CULong  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CLLong  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CULLong  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CBool  Since: deepseq1.4.3.0 
Defined in Control.DeepSeq  
NFData CFloat  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CDouble  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CPtrdiff  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CSize  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CWchar  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CSigAtomic  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq rnf :: CSigAtomic > () #  
NFData CClock  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CTime  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CUSeconds  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CSUSeconds  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq rnf :: CSUSeconds > () #  
NFData CFile  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CFpos  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CJmpBuf  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CIntPtr  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CUIntPtr  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CIntMax  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData CUIntMax  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData Fingerprint  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq rnf :: Fingerprint > () #  
NFData SrcLoc  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData JSValueForSend  
Defined in Language.Javascript.JSaddle.Types rnf :: JSValueForSend > () #  
NFData JSObjectForSend  
Defined in Language.Javascript.JSaddle.Types rnf :: JSObjectForSend > () #  
NFData JSStringForSend  
Defined in Language.Javascript.JSaddle.Types rnf :: JSStringForSend > () #  
NFData AsyncCommand  
Defined in Language.Javascript.JSaddle.Types rnf :: AsyncCommand > () #  
NFData Command  
Defined in Language.Javascript.JSaddle.Types  
NFData Batch  
Defined in Language.Javascript.JSaddle.Types  
NFData JSVal  
Defined in GHCJS.Prim.Internal  
NFData Doc  
Defined in Text.PrettyPrint.HughesPJ  
NFData TextDetails  
Defined in Text.PrettyPrint.Annotated.HughesPJ rnf :: TextDetails > () #  
NFData ByteArray  
Defined in Data.Primitive.ByteArray  
NFData StdGen  
Defined in System.Random.Internal  
NFData ZonedTime  
Defined in Data.Time.LocalTime.Internal.ZonedTime  
NFData LocalTime  
Defined in Data.Time.LocalTime.Internal.LocalTime  
NFData UUID  
Defined in Data.UUID.Types.Internal  
NFData a => NFData [a]  
Defined in Control.DeepSeq  
NFData a => NFData (Maybe a)  
Defined in Control.DeepSeq  
NFData a => NFData (Ratio a)  
Defined in Control.DeepSeq  
NFData (Ptr a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData (FunPtr a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData a => NFData (IResult a)  
Defined in Data.Aeson.Types.Internal  
NFData a => NFData (Result a)  
Defined in Data.Aeson.Types.Internal  
NFData a => NFData (Complex a)  
Defined in Control.DeepSeq  
NFData a => NFData (Min a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData a => NFData (Max a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData a => NFData (First a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData a => NFData (Last a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData m => NFData (WrappedMonoid m)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq rnf :: WrappedMonoid m > () #  
NFData a => NFData (Option a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData (StableName a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq rnf :: StableName a > () #  
NFData a => NFData (ZipList a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData a => NFData (Identity a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData (IORef a)  NOTE: Only strict in the reference and not the referenced value. Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData a => NFData (First a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData a => NFData (Last a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData a => NFData (Dual a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData a => NFData (Sum a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData a => NFData (Product a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData a => NFData (Down a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData (MVar a)  NOTE: Only strict in the reference and not the referenced value. Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData a => NFData (NonEmpty a)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData1 f => NFData (Fix f)  
NFData a => NFData (DNonEmpty a)  
Defined in Data.DList.DNonEmpty.Internal  
NFData a => NFData (DList a)  
Defined in Data.DList.Internal  
NFData (Vector a)  
Defined in Data.Vector.Primitive  
NFData (Vector a)  
Defined in Data.Vector.Storable  
NFData (Vector a)  
Defined in Data.Vector.Unboxed.Base  
NFData a => NFData (HashSet a)  
Defined in Data.HashSet.Internal  
NFData a => NFData (Vector a)  
Defined in Data.Vector  
NFData a => NFData (Doc a)  
Defined in Text.PrettyPrint.Annotated.HughesPJ  
NFData a => NFData (AnnotDetails a)  
Defined in Text.PrettyPrint.Annotated.HughesPJ rnf :: AnnotDetails a > () #  
NFData (PrimArray a)  
Defined in Data.Primitive.PrimArray  
NFData (MutableByteArray s)  
Defined in Data.Primitive.ByteArray rnf :: MutableByteArray s > () #  
NFData a => NFData (SmallArray a)  
Defined in Data.Primitive.SmallArray rnf :: SmallArray a > () #  
NFData a => NFData (Array a)  
Defined in Data.Primitive.Array  
NFData g => NFData (AtomicGen g)  
Defined in System.Random.Stateful  
NFData g => NFData (IOGen g)  
Defined in System.Random.Stateful  
NFData g => NFData (STGen g)  
Defined in System.Random.Stateful  
NFData g => NFData (StateGen g)  
Defined in System.Random.Internal  
NFData a => NFData (Maybe a)  
Defined in Data.Strict.Maybe  
NFData (a > b)  This instance is for convenience and consistency with Since: deepseq1.3.0.0 
Defined in Control.DeepSeq  
(NFData a, NFData b) => NFData (Either a b)  
Defined in Control.DeepSeq  
(NFData a, NFData b) => NFData (a, b)  
Defined in Control.DeepSeq  
(NFData k, NFData v) => NFData (HashMap k v)  
Defined in Data.HashMap.Internal  
(NFData k, NFData a) => NFData (Map k a)  
Defined in Data.Map.Internal  
(NFData a, NFData b) => NFData (Array a b)  
Defined in Control.DeepSeq  
(NFData i, NFData r) => NFData (IResult i r)  
Defined in Data.Attoparsec.Internal.Types  
NFData (Fixed a)  Since: deepseq1.3.0.0 
Defined in Control.DeepSeq  
(NFData a, NFData b) => NFData (Arg a b)  Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData (Proxy a)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData (STRef s a)  NOTE: Only strict in the reference and not the referenced value. Since: deepseq1.4.2.0 
Defined in Control.DeepSeq  
NFData (MutablePrimArray s a)  
Defined in Data.Primitive.PrimArray rnf :: MutablePrimArray s a > () #  
(NFData a, NFData b) => NFData (Pair a b)  
Defined in Data.Strict.Tuple  
(NFData a, NFData b) => NFData (These a b)  
Defined in Data.Strict.These  
(NFData a, NFData b) => NFData (Either a b)  
Defined in Data.Strict.Either  
(NFData a, NFData b) => NFData (These a b)  Since: these0.7.1 
Defined in Data.These  
(NFData k, NFData v) => NFData (Leaf k v)  
Defined in Data.HashMap.Internal  
NFData (MVector s a)  
Defined in Data.Vector.Unboxed.Base  
(NFData a1, NFData a2, NFData a3) => NFData (a1, a2, a3)  
Defined in Control.DeepSeq  
NFData a => NFData (Const a b)  Since: deepseq1.4.0.0 
Defined in Control.DeepSeq  
NFData (a :~: b)  Since: deepseq1.4.3.0 
Defined in Control.DeepSeq  
NFData b => NFData (Tagged s b)  
Defined in Data.Tagged  
(NFData1 f, NFData1 g, NFData a) => NFData (These1 f g a)  This instance is available only with 
Defined in Data.Functor.These  
(NFData a1, NFData a2, NFData a3, NFData a4) => NFData (a1, a2, a3, a4)  
Defined in Control.DeepSeq  
(NFData1 f, NFData1 g, NFData a) => NFData (Product f g a)  Since: deepseq1.4.3.0 
Defined in Control.DeepSeq  
(NFData1 f, NFData1 g, NFData a) => NFData (Sum f g a)  Since: deepseq1.4.3.0 
Defined in Control.DeepSeq  
NFData (a :~~: b)  Since: deepseq1.4.3.0 
Defined in Control.DeepSeq  
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData (a1, a2, a3, a4, a5)  
Defined in Control.DeepSeq  
(NFData1 f, NFData1 g, NFData a) => NFData (Compose f g a)  Since: deepseq1.4.3.0 
Defined in Control.DeepSeq  
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData (a1, a2, a3, a4, a5, a6)  
Defined in Control.DeepSeq  
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData (a1, a2, a3, a4, a5, a6, a7)  
Defined in Control.DeepSeq  
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8) => NFData (a1, a2, a3, a4, a5, a6, a7, a8)  
Defined in Control.DeepSeq  
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8, NFData a9) => NFData (a1, a2, a3, a4, a5, a6, a7, a8, a9)  
Defined in Control.DeepSeq 
a variant of deepseq
that is useful in some circumstances:
force x = x `deepseq` x
force x
fully evaluates x
, and then returns it. Note that
force x
only performs evaluation when the value of force x
itself is demanded, so essentially it turns shallow evaluation into
deep evaluation.
force
can be conveniently used in combination with ViewPatterns
:
{# LANGUAGE BangPatterns, ViewPatterns #} import Control.DeepSeq someFun :: ComplexData > SomeResult someFun (force > !arg) = { 'arg' will be fully evaluated }
Another useful application is to combine force
with
evaluate
in order to force deep evaluation
relative to other IO
operations:
import Control.Exception (evaluate) import Control.DeepSeq main = do result < evaluate $ force $ pureComputation { 'result' will be fully evaluated at this point } return ()
Finally, here's an exception safe variant of the readFile'
example:
readFile' :: FilePath > IO String readFile' fn = bracket (openFile fn ReadMode) hClose $ \h > evaluate . force =<< hGetContents h
Since: deepseq1.2.0.0