packages feed

deepseq 1.4.8.1 → 1.6.0.0

raw patch · 5 files changed

Files

Control/DeepSeq.hs view
@@ -1,25 +1,22 @@-{-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE EmptyCase #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE Safe #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE Trustworthy #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE EmptyCase #-}  #if __GLASGOW_HASKELL__ >= 811 && __GLASGOW_HASKELL__ < 901 -- For the Option instance (https://gitlab.haskell.org/ghc/ghc/issues/15028) {-# OPTIONS_GHC -Wno-deprecations #-} #endif -#define BYTEARRAY_IN_BASE (__GLASGOW_HASKELL__ >= 903)--- At the moment of writing GHC source tree has not yet bumped `base` version,--- so using __GLASGOW_HASKELL__ as a proxy instead of MIN_VERSION_base(4,17,0).- -----------------------------------------------------------------------------+ -- | -- Module      :  Control.DeepSeq -- Copyright   :  (c) The University of Glasgow 2001-2009@@ -72,65 +69,63 @@ -- -- @since 1.1.0.0 module Control.DeepSeq (-     -- * 'NFData' class-     NFData(rnf),-     -- * Helper functions-     deepseq,-     force,-     ($!!),-     (<$!!>),-     rwhnf,+  -- * 'NFData' class+  NFData (rnf), -     -- * Liftings of the 'NFData' class-     -- ** For unary constructors-     NFData1(liftRnf), rnf1,-     -- ** For binary constructors-     NFData2(liftRnf2), rnf2,-  ) where+  -- * Helper functions+  deepseq,+  force,+  ($!!),+  (<$!!>),+  rwhnf,+  Unit(..), +  -- * Liftings of the 'NFData' class++  -- ** For unary constructors+  NFData1 (liftRnf),+  rnf1,++  -- ** For binary constructors+  NFData2 (liftRnf2),+  rnf2,+) where+ import Control.Applicative-import Control.Concurrent ( ThreadId, MVar )-import Control.Exception ( MaskingState(..) )+import Control.Concurrent (MVar, ThreadId)+import Control.Exception (MaskingState (..))+import Data.Complex+import Data.Fixed+import Data.Functor.Compose+import Data.Functor.Identity (Identity (..))+import qualified Data.Functor.Product as Functor+import qualified Data.Functor.Sum as Functor import Data.IORef-import Data.STRef import Data.Int-import Data.Word+import Data.List.NonEmpty (NonEmpty (..))+import Data.Monoid as Mon+import Data.Ord (Down (Down))+import Data.Proxy (Proxy (Proxy)) import Data.Ratio-import Data.Complex-import Data.Array-import Data.Fixed+import Data.STRef+import Data.Semigroup as Semi+import Data.Type.Equality ((:~:), (:~~:))+import Data.Typeable (TyCon, TypeRep, rnfTyCon, rnfTypeRep)+import Data.Unique (Unique) import Data.Version-import Data.Monoid as Mon-import Data.Typeable ( TypeRep, rnfTypeRep, TyCon, rnfTyCon )-import Data.Unique ( Unique )-import Foreign.Ptr+import Data.Void (Void, absurd)+import Data.Word import Foreign.C.Types-import System.Exit ( ExitCode(..) )-import System.Mem.StableName ( StableName )-import Data.Ord ( Down(Down) )-import Data.Proxy ( Proxy(Proxy) )--#if MIN_VERSION_base(4,10,0)-import Data.Type.Equality ( (:~:), (:~~:) )-import qualified Type.Reflection as Reflection-#else-import Data.Type.Equality ( (:~:) )-#endif--import Data.Functor.Identity ( Identity(..) )-import Data.Void ( Void, absurd )-import Numeric.Natural ( Natural )--import Data.List.NonEmpty ( NonEmpty (..) )-import Data.Semigroup as Semi--import GHC.Stack.Types ( CallStack(..), SrcLoc(..) )-import Data.Functor.Compose-import qualified Data.Functor.Sum as Functor-import qualified Data.Functor.Product as Functor--import GHC.Fingerprint.Type ( Fingerprint(..) )+import Foreign.Ptr+import GHC.Arr (Array)+import qualified GHC.Arr+import GHC.Fingerprint.Type (Fingerprint (..)) import GHC.Generics+import GHC.Stack.Types (CallStack (..), SrcLoc (..))+import Numeric.Natural (Natural)+import System.Exit (ExitCode (..))+import System.Mem.StableName (StableName)+import qualified Type.Reflection as Reflection  #ifdef MIN_VERSION_ghc_prim #if MIN_VERSION_ghc_prim(0,7,0)@@ -138,7 +133,7 @@ #endif #endif -#if BYTEARRAY_IN_BASE+#if MIN_VERSION_base(4,17,0) import Data.Array.Byte (ByteArray(..), MutableByteArray(..)) #endif @@ -150,10 +145,13 @@   grnf _ x = case x of {}  data Zero+ data One  data family RnfArgs arity a+ data instance RnfArgs Zero a = RnfArgs0+ newtype instance RnfArgs One a = RnfArgs1 (a -> ())  instance GNFData arity U1 where@@ -169,8 +167,8 @@  instance GNFData arity (URec a) where   grnf _ = rwhnf -- Every URec data instance consists of a single data-                 -- constructor containing a single strict field, so reducing-                 -- any URec instance to WHNF suffices to reduce it to NF.+  -- constructor containing a single strict field, so reducing+  -- any URec instance to WHNF suffices to reduce it to NF.   {-# INLINEABLE grnf #-}  instance (GNFData arity a, GNFData arity b) => GNFData arity (a :*: b) where@@ -183,15 +181,16 @@   {-# INLINEABLE grnf #-}  instance GNFData One Par1 where-    grnf (RnfArgs1 r) = r . unPar1+  grnf (RnfArgs1 r) = r . unPar1  instance NFData1 f => GNFData One (Rec1 f) where-    grnf (RnfArgs1 r) = liftRnf r . unRec1+  grnf (RnfArgs1 r) = liftRnf r . unRec1  instance (NFData1 f, GNFData One g) => GNFData One (f :.: g) where-    grnf args = liftRnf (grnf args) . unComp1+  grnf args = liftRnf (grnf args) . unComp1  infixr 0 $!!+ infixr 0 `deepseq`  -- | 'deepseq': fully evaluates the first argument, before returning the@@ -217,14 +216,19 @@ deepseq :: NFData a => a -> b -> b deepseq a b = rnf a `seq` b --- | the deep analogue of '$!'.  In the expression @f $!! x@, @x@ is--- fully evaluated before the function @f@ is applied to it.+-- | The deep analogue of '$!'.  @f $!! x@ fully evaluates @x@+-- before returning @f x@. --+-- There is no guarantee about the ordering of evaluation.+-- @f x@ may be evaluated before @x@ is fully evaluated.+-- To impose an actual order on evaluation, use 'pseq' from+-- "Control.Parallel" in the @parallel@ package.+-- -- @since 1.2.0.0 ($!!) :: (NFData a) => (a -> b) -> a -> b f $!! x = x `deepseq` f x --- | a variant of 'deepseq' that is useful in some circumstances:+-- | A variant of 'deepseq' that is useful in some circumstances: -- -- > force x = x `deepseq` x --@@ -267,14 +271,8 @@ -- -- @since 1.4.3.0 (<$!!>) :: (Monad m, NFData b) => (a -> b) -> m a -> m b-#if MIN_VERSION_base(4,8,0)--- Minor optimisation for AMP; this avoids the redundant indirection--- through 'return' in case GHC isn't smart enough to optimise it away--- on its own f <$!!> m = m >>= \x -> pure $!! f x-#else-f <$!!> m = m >>= \x -> return $!! f x-#endif+ infixl 4 <$!!>  -- | Reduce to weak head normal form@@ -297,89 +295,88 @@ -- -- @since 1.1.0.0 class NFData a where-    -- | 'rnf' should reduce its argument to normal form (that is, fully-    -- evaluate all sub-components), 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 auto-derived 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 @deepseq-1.4.0.0@, the default-    -- implementation is based on @DefaultSignatures@ allowing for-    -- more accurate auto-derived '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 !_ = ()-    ---    rnf :: a -> ()--    default rnf :: (Generic a, GNFData Zero (Rep a)) => a -> ()-    rnf = grnf RnfArgs0 . from+  -- | 'rnf' should reduce its argument to normal form (that is, fully+  -- evaluate all sub-components), 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 auto-derived 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 @deepseq-1.4.0.0@, the default+  -- implementation is based on @DefaultSignatures@ allowing for+  -- more accurate auto-derived '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 !_ = ()+  rnf :: a -> ()+  default rnf :: (Generic a, GNFData Zero (Rep a)) => a -> ()+  rnf = grnf RnfArgs0 . from  -- | A class of functors that can be fully evaluated. --+-- In `deepseq-1.5.0.0` this class was updated to include superclasses.+-- -- @since 1.4.3.0-class NFData1 f where-    -- | 'liftRnf' should reduce its argument to normal form (that is, fully-    -- evaluate all sub-components), given an argument to reduce @a@ arguments,-    -- and then return '()'.-    ---    -- See 'rnf' for the generic deriving.-    liftRnf :: (a -> ()) -> f a -> ()--    default liftRnf :: (Generic1 f, GNFData One (Rep1 f)) => (a -> ()) -> f a -> ()-    liftRnf r = grnf (RnfArgs1 r) . from1+class (forall a. NFData a => NFData (f a)) => NFData1 f where+  -- | 'liftRnf' should reduce its argument to normal form (that is, fully+  -- evaluate all sub-components), given an argument to reduce @a@ arguments,+  -- and then return '()'.+  --+  -- See 'rnf' for the generic deriving.+  liftRnf :: (a -> ()) -> f a -> ()+  default liftRnf :: (Generic1 f, GNFData One (Rep1 f)) => (a -> ()) -> f a -> ()+  liftRnf r = grnf (RnfArgs1 r) . from1  -- | Lift the standard 'rnf' function through the type constructor. --@@ -389,15 +386,17 @@  -- | A class of bifunctors that can be fully evaluated. --+-- In `deepseq-1.5.0.0` this class was updated to include superclasses.+-- -- @since 1.4.3.0-class NFData2 p where-    -- | 'liftRnf2' should reduce its argument to normal form (that-    -- is, fully evaluate all sub-components), given functions to-    -- reduce @a@ and @b@ arguments respectively, and then return '()'.-    ---    -- __Note__: Unlike for the unary 'liftRnf', there is currently no-    -- support for generically deriving 'liftRnf2'.-    liftRnf2 :: (a -> ()) -> (b -> ()) -> p a b -> ()+class (forall a. NFData a => NFData1 (p a)) => NFData2 p where+  -- | 'liftRnf2' should reduce its argument to normal form (that+  -- is, fully evaluate all sub-components), given functions to+  -- reduce @a@ and @b@ arguments respectively, and then return '()'.+  --+  -- __Note__: Unlike for the unary 'liftRnf', there is currently no+  -- support for generically deriving 'liftRnf2'.+  liftRnf2 :: (a -> ()) -> (b -> ()) -> p a b -> ()  -- | Lift the standard 'rnf' function through the type constructor. --@@ -405,81 +404,136 @@ rnf2 :: (NFData2 p, NFData a, NFData b) => p a b -> () rnf2 = liftRnf2 rnf rnf +-- | A monoid with @(<>) = seq@.+--+-- Its purpose is to allow reducing structures to normal form using+-- 'foldMap'-like functions.+--+-- ==== __Examples__+--+-- @+-- data Three a = Three a a a+--+-- instance Foldable Three where+--   foldMap f (Three x1 x2 x3) = f x1 <> f x2 <> f x3+--+-- instance NFData a => NFData (Three a) where+--   rnf = runUnit . foldMap (Unit . rnf)+-- @+--+-- @+-- data Tree a b+--   = NodeA a [Tree a b]+--   | NodeB b [Tree a b]+--+-- foldMapTree :: Monoid m => (a -> m) -> (b -> m) -> Tree a b -> m+-- foldMapTree f g = go+--   where+--     go (NodeA x ts) = f x <> foldMap go ts+--     go (NodeB y ts) = g y <> foldMap go ts+--+-- instance NFData2 Tree where+--   liftRnf2 r r' = runUnit . foldMapTree (Unit . r) (Unit . r')+-- @+newtype Unit = Unit { runUnit :: () } -instance NFData Int      where rnf = rwhnf-instance NFData Word     where rnf = rwhnf-instance NFData Integer  where rnf = rwhnf-instance NFData Float    where rnf = rwhnf-instance NFData Double   where rnf = rwhnf+instance Semigroup Unit where+  (<>) = seq -instance NFData Char     where rnf = rwhnf-instance NFData Bool     where rnf = rwhnf+instance Monoid Unit where+  mempty = Unit ()++instance NFData Int where rnf = rwhnf++instance NFData Word where rnf = rwhnf++instance NFData Integer where rnf = rwhnf++instance NFData Float where rnf = rwhnf++instance NFData Double where rnf = rwhnf++instance NFData Char where rnf = rwhnf++instance NFData Bool where rnf = rwhnf+ instance NFData Ordering where rnf = rwhnf-instance NFData ()       where rnf = rwhnf -instance NFData Int8     where rnf = rwhnf-instance NFData Int16    where rnf = rwhnf-instance NFData Int32    where rnf = rwhnf-instance NFData Int64    where rnf = rwhnf+instance NFData () where rnf = rwhnf -instance NFData Word8    where rnf = rwhnf-instance NFData Word16   where rnf = rwhnf-instance NFData Word32   where rnf = rwhnf-instance NFData Word64   where rnf = rwhnf+instance NFData Int8 where rnf = rwhnf +instance NFData Int16 where rnf = rwhnf++instance NFData Int32 where rnf = rwhnf++instance NFData Int64 where rnf = rwhnf++instance NFData Word8 where rnf = rwhnf++instance NFData Word16 where rnf = rwhnf++instance NFData Word32 where rnf = rwhnf++instance NFData Word64 where rnf = rwhnf+ -- | @since 1.4.4.0 instance NFData MaskingState where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData (Proxy a) where rnf Proxy = ()--- |@since 1.4.3.0-instance NFData1 Proxy    where liftRnf _ Proxy = ()  -- | @since 1.4.3.0+instance NFData1 Proxy where liftRnf _ Proxy = ()++-- | @since 1.4.3.0 instance NFData (a :~: b) where rnf = rwhnf+ -- | @since 1.4.3.0 instance NFData1 ((:~:) a) where liftRnf _ = rwhnf+ -- | @since 1.4.3.0 instance NFData2 (:~:) where liftRnf2 _ _ = rwhnf -#if MIN_VERSION_base(4,10,0) -- | @since 1.4.3.0 instance NFData (a :~~: b) where rnf = rwhnf+ -- | @since 1.4.3.0 instance NFData1 ((:~~:) a) where liftRnf _ = rwhnf+ -- | @since 1.4.3.0 instance NFData2 (:~~:) where liftRnf2 _ _ = rwhnf-#endif --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (Identity a) where-    rnf = rnf1+  rnf = rnf1 --- |@since 1.4.3.0+-- | @since 1.4.3.0 instance NFData1 Identity where-    liftRnf r = r . runIdentity+  liftRnf r = r . runIdentity  -- | Defined as @'rnf' = 'absurd'@. -- -- @since 1.4.0.0 instance NFData Void where-    rnf = absurd+  rnf = absurd --- |@since 1.4.0.0-instance NFData Natural  where rnf = rwhnf+-- | @since 1.4.0.0+instance NFData Natural where rnf = rwhnf --- |@since 1.3.0.0+-- | @since 1.3.0.0 instance NFData (Fixed a) where rnf = rwhnf--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Fixed where liftRnf _ = rwhnf --- |This instance is for convenience and consistency with 'seq'.--- This assumes that WHNF is equivalent to NF for functions.+-- | This instance is for convenience and consistency with 'seq'.+--  This assumes that WHNF is equivalent to NF for functions. ----- @since 1.3.0.0+--  @since 1.3.0.0 instance NFData (a -> b) where rnf = rwhnf ---Rational and complex numbers.+-- Rational and complex numbers.  -- | Available on @base >=4.9@ --@@ -491,371 +545,399 @@ instance (NFData1 f, NFData1 g) => NFData1 (Compose f g) where   liftRnf r = liftRnf (liftRnf r) . getCompose --- | @since 1.4.3.0-instance (NFData1 f, NFData1 g, NFData a) => NFData (Compose f g a) where-  rnf = rnf1+-- | Note: in @deepseq-1.5.0.0@ this instance's superclasses were changed.+-- +-- @since 1.4.3.0+instance (NFData (f (g a))) => NFData (Compose f g a) where+  rnf (Compose fga) = rnf fga  -- | @since 1.4.3.0 instance (NFData1 f, NFData1 g) => NFData1 (Functor.Sum f g) where   liftRnf rnf0 (Functor.InL l) = liftRnf rnf0 l   liftRnf rnf0 (Functor.InR r) = liftRnf rnf0 r --- | @since 1.4.3.0-instance (NFData1 f, NFData1 g, NFData a) => NFData (Functor.Sum f g a) where-  rnf = rnf1+-- | Note: in @deepseq-1.5.0.0@ this instance's superclasses were changed.+-- +-- @since 1.4.3.0+instance (NFData (f a), NFData (g a)) => NFData (Functor.Sum f g a) where+  rnf (Functor.InL fa) = rnf fa+  rnf (Functor.InR ga) = rnf ga  -- | @since 1.4.3.0 instance (NFData1 f, NFData1 g) => NFData1 (Functor.Product f g) where   liftRnf rnf0 (Functor.Pair f g) = liftRnf rnf0 f `seq` liftRnf rnf0 g --- | @since 1.4.3.0-instance (NFData1 f, NFData1 g, NFData a) => NFData (Functor.Product f g a) where-  rnf = rnf1+-- | Note: in @deepseq-1.5.0.0@ this instance's superclasses were changed.+-- +-- @since 1.4.3.0+instance (NFData (f a), NFData (g a)) => NFData (Functor.Product f g a) where+  rnf (Functor.Pair fa ga) = rnf fa `seq` rnf ga  instance NFData a => NFData (Ratio a) where   rnf x = rnf (numerator x, denominator x)  instance (NFData a) => NFData (Complex a) where-  rnf (x:+y) = rnf x `seq`-               rnf y `seq`-               ()+  rnf (x :+ y) = rnf x `seq` rnf y `seq` ()  instance NFData a => NFData (Maybe a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Maybe where-    liftRnf _r Nothing  = ()-    liftRnf  r (Just x) = r x+  liftRnf _r Nothing = ()+  liftRnf r (Just x) = r x  instance (NFData a, NFData b) => NFData (Either a b) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance (NFData a) => NFData1 (Either a) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData2 Either where-    liftRnf2  l _r (Left x)  = l x-    liftRnf2 _l  r (Right y) = r y+  liftRnf2 l _r (Left x) = l x+  liftRnf2 _l r (Right y) = r y --- |@since 1.3.0.0+-- | @since 1.3.0.0 instance NFData Data.Version.Version where-    rnf (Data.Version.Version branch tags) = rnf branch `seq` rnf tags+  rnf (Data.Version.Version branch tags) = rnf branch `seq` rnf tags  instance NFData a => NFData [a] where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 [] where-    liftRnf r = go-      where-        go [] = ()-        go (x:xs) = r x `seq` go xs+  liftRnf f = foldr (\x r -> f x `seq` r) ()+  {-# INLINABLE liftRnf #-} --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (ZipList a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 ZipList where-    liftRnf r = liftRnf r . getZipList+  liftRnf r = liftRnf r . getZipList --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (Const a b) where-    rnf = rnf . getConst--- |@since 1.4.3.0+  rnf = rnf . getConst++-- | @since 1.4.3.0 instance NFData a => NFData1 (Const a) where-    liftRnf _ = rnf . getConst--- |@since 1.4.3.0+  liftRnf _ = rnf . getConst++-- | @since 1.4.3.0 instance NFData2 Const where-    liftRnf2 r _ = r . getConst+  liftRnf2 r _ = r . getConst  -- We should use MIN_VERSION array(0,5,1,1) but that's not possible. -- There isn't an underscore to not break C preprocessor instance (NFData a, NFData b) => NFData (Array a b) where-    rnf x = rnf (bounds x, Data.Array.elems x)+  rnf x = rnf (GHC.Arr.bounds x, GHC.Arr.elems x) --- |@since 1.4.3.0+-- | @since 1.4.3.0 instance (NFData a) => NFData1 (Array a) where-    liftRnf r x = rnf (bounds x) `seq` liftRnf r (Data.Array.elems x)+  liftRnf r x = rnf (GHC.Arr.bounds x) `seq` liftRnf r (GHC.Arr.elems x) --- |@since 1.4.3.0+-- | @since 1.4.3.0 instance NFData2 Array where-    liftRnf2 r r' x = liftRnf2 r r (bounds x) `seq` liftRnf r' (Data.Array.elems x)+  liftRnf2 r r' x =+    liftRnf2 r r (GHC.Arr.bounds x) `seq` liftRnf r' (GHC.Arr.elems x) --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (Down a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Down where-    liftRnf r (Down x) = r x+  liftRnf r (Down x) = r x --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (Dual a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Dual where-    liftRnf r (Dual x) = r x+  liftRnf r (Dual x) = r x --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (Mon.First a) where rnf = rnf1--- |@since 1.4.3.0-instance NFData1 Mon.First  where-    liftRnf r (Mon.First x) = liftRnf r x --- |@since 1.4.0.0+-- | @since 1.4.3.0+instance NFData1 Mon.First where+  liftRnf r (Mon.First x) = liftRnf r x++-- | @since 1.4.0.0 instance NFData a => NFData (Mon.Last a) where rnf = rnf1--- |@since 1.4.3.0-instance NFData1 Mon.Last  where-    liftRnf r (Mon.Last  x) = liftRnf r x --- |@since 1.4.0.0+-- | @since 1.4.3.0+instance NFData1 Mon.Last where+  liftRnf r (Mon.Last x) = liftRnf r x++-- | @since 1.4.0.0 instance NFData Any where rnf = rnf . getAny --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData All where rnf = rnf . getAll --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (Sum a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Sum where-    liftRnf r (Sum x) = r x+  liftRnf r (Sum x) = r x --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData a => NFData (Product a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Product where-    liftRnf r (Product x) = r x+  liftRnf r (Product x) = r x --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData (StableName a) where-    rnf = rwhnf -- assumes `data StableName a = StableName (StableName# a)`--- |@since 1.4.3.0+  rnf = rwhnf -- assumes `data StableName a = StableName (StableName# a)`++-- | @since 1.4.3.0 instance NFData1 StableName where-    liftRnf _ = rwhnf+  liftRnf _ = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData ThreadId where-    rnf = rwhnf -- assumes `data ThreadId = ThreadId ThreadId#`+  rnf = rwhnf -- assumes `data ThreadId = ThreadId ThreadId#` --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData Unique where-    rnf = rwhnf -- assumes `newtype Unique = Unique Integer`+  rnf = rwhnf -- assumes `newtype Unique = Unique Integer`  -- | __NOTE__: Prior to @deepseq-1.4.4.0@ this instance was only defined for @base-4.8.0.0@ and later. -- -- @since 1.4.0.0 instance NFData TypeRep where-    rnf tyrep = rnfTypeRep tyrep+  rnf tyrep = rnfTypeRep tyrep  -- | __NOTE__: Prior to @deepseq-1.4.4.0@ this instance was only defined for @base-4.8.0.0@ and later. -- -- @since 1.4.0.0 instance NFData TyCon where-    rnf tycon = rnfTyCon tycon+  rnf tycon = rnfTyCon tycon -#if MIN_VERSION_base(4,10,0)--- |@since 1.4.8.0+-- | @since 1.4.8.0 instance NFData (Reflection.TypeRep a) where-    rnf tr = Reflection.rnfTypeRep tr+  rnf tr = Reflection.rnfTypeRep tr --- |@since 1.4.8.0+-- | @since 1.4.8.0 instance NFData Reflection.Module where-    rnf modul = Reflection.rnfModule modul-#endif+  rnf modul = Reflection.rnfModule modul  -- | __NOTE__: Only strict in the reference and not the referenced value. -- -- @since 1.4.2.0 instance NFData (IORef a) where-    rnf = rwhnf--- |@since 1.4.3.0+  rnf = rwhnf++-- | @since 1.4.3.0 instance NFData1 IORef where-    liftRnf _ = rwhnf+  liftRnf _ = rwhnf  -- | __NOTE__: Only strict in the reference and not the referenced value. -- -- @since 1.4.2.0 instance NFData (STRef s a) where-    rnf = rwhnf--- |@since 1.4.3.0+  rnf = rwhnf++-- | @since 1.4.3.0 instance NFData1 (STRef s) where-    liftRnf _ = rwhnf--- |@since 1.4.3.0+  liftRnf _ = rwhnf++-- | @since 1.4.3.0 instance NFData2 STRef where-    liftRnf2 _ _ = rwhnf+  liftRnf2 _ _ = rwhnf  -- | __NOTE__: Only strict in the reference and not the referenced value. -- -- @since 1.4.2.0 instance NFData (MVar a) where   rnf = rwhnf--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 MVar where-    liftRnf _ = rwhnf+  liftRnf _ = rwhnf  ---------------------------------------------------------------------------- -- GHC Specifics --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData Fingerprint where-    rnf (Fingerprint _ _) = ()+  rnf (Fingerprint _ _) = ()  ---------------------------------------------------------------------------- -- Foreign.Ptr --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData (Ptr a) where-    rnf = rwhnf--- |@since 1.4.3.0+  rnf = rwhnf++-- | @since 1.4.3.0 instance NFData1 Ptr where-    liftRnf _ = rwhnf+  liftRnf _ = rwhnf --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData (FunPtr a) where-    rnf = rwhnf--- |@since 1.4.3.0+  rnf = rwhnf++-- | @since 1.4.3.0 instance NFData1 FunPtr where-    liftRnf _ = rwhnf+  liftRnf _ = rwhnf  ---------------------------------------------------------------------------- -- Foreign.C.Types --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CChar where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CSChar where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CUChar where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CShort where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CUShort where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CInt where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CUInt where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CLong where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CULong where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CPtrdiff where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CSize where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CWchar where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CSigAtomic where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CLLong where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CULLong where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CIntPtr where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CUIntPtr where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CIntMax where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CUIntMax where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CClock where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CTime where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CUSeconds where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CSUSeconds where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CFloat where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CDouble where rnf = rwhnf  -- NOTE: The types `CFile`, `CFPos`, and `CJmpBuf` below are not -- newtype wrappers rather defined as field-less single-constructor -- types. --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CFile where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CFpos where rnf = rwhnf --- |@since 1.4.0.0+-- | @since 1.4.0.0 instance NFData CJmpBuf where rnf = rwhnf -#if MIN_VERSION_base(4,10,0) -- | @since 1.4.3.0 instance NFData CBool where rnf = rwhnf-#endif  ---------------------------------------------------------------------------- -- System.Exit --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData ExitCode where   rnf (ExitFailure n) = rnf n-  rnf ExitSuccess     = ()+  rnf ExitSuccess = ()  ---------------------------------------------------------------------------- -- instances previously provided by semigroups package --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData a => NFData (NonEmpty a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 NonEmpty where   liftRnf r (x :| xs) = r x `seq` liftRnf r xs --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData a => NFData (Min a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Min where   liftRnf r (Min a) = r a --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData a => NFData (Max a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Max where   liftRnf r (Max a) = r a --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance (NFData a, NFData b) => NFData (Arg a b) where rnf = rnf2--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance (NFData a) => NFData1 (Arg a) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData2 Arg where   liftRnf2 r r' (Arg a b) = r a `seq` r' b `seq` () --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData a => NFData (Semi.First a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Semi.First where   liftRnf r (Semi.First a) = r a --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData a => NFData (Semi.Last a) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 Semi.Last where   liftRnf r (Semi.Last a) = r a --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData m => NFData (WrappedMonoid m) where rnf = rnf1--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData1 WrappedMonoid where   liftRnf r (WrapMonoid a) = r a @@ -870,16 +952,16 @@ ---------------------------------------------------------------------------- -- GHC.Stack --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData SrcLoc where-  rnf (SrcLoc a b c d e f g) = rnf a `seq` rnf b `seq` rnf c `seq`-                               rnf d `seq` rnf e `seq` rnf f `seq` rnf g+  rnf (SrcLoc a b c d e f g) =+    rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` rnf f `seq` rnf g --- |@since 1.4.2.0+-- | @since 1.4.2.0 instance NFData CallStack where   rnf EmptyCallStack = ()   rnf (PushCallStack a b c) = rnf a `seq` rnf b `seq` rnf c-  rnf (FreezeCallStack a)   = rnf a+  rnf (FreezeCallStack a) = rnf a  ---------------------------------------------------------------------------- -- Tuples@@ -903,88 +985,167 @@ #endif #endif -instance (NFData a, NFData b) => NFData (a,b) where rnf = rnf2--- |@since 1.4.3.0+instance (NFData a, NFData b) => NFData (a, b) where rnf = rnf2++-- | @since 1.4.3.0 instance (NFData a) => NFData1 ((,) a) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0++-- | @since 1.4.3.0 instance NFData2 (,) where-  liftRnf2 r r' (x,y) = r x `seq` r' y+  liftRnf2 r r' (x, y) = r x `seq` r' y  -- Code below is generated, see generate-nfdata-tuple.hs-instance (NFData a1, NFData a2, NFData a3) =>-         NFData (a1, a2, a3) where rnf = rnf2--- |@since 1.4.3.0-instance (NFData a1, NFData a2) =>-         NFData1 ((,,) a1 a2) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0-instance (NFData a1) =>-         NFData2 ((,,) a1) where-  liftRnf2 r r' (x1,x2,x3) = rnf x1 `seq` r x2 `seq` r' x3+instance+  (NFData a1, NFData a2, NFData a3) =>+  NFData (a1, a2, a3)+  where+  rnf = rnf2 -instance (NFData a1, NFData a2, NFData a3, NFData a4) =>-         NFData (a1, a2, a3, a4) where rnf = rnf2--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3) =>-         NFData1 ((,,,) a1 a2 a3) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0-instance (NFData a1, NFData a2) =>-         NFData2 ((,,,) a1 a2) where-  liftRnf2 r r' (x1,x2,x3,x4) = rnf x1 `seq` rnf x2 `seq` r x3 `seq` r' x4+-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2) =>+  NFData1 ((,,) a1 a2)+  where+  liftRnf = liftRnf2 rnf -instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>-         NFData (a1, a2, a3, a4, a5) where rnf = rnf2--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4) =>-         NFData1 ((,,,,) a1 a2 a3 a4) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3) =>-         NFData2 ((,,,,) a1 a2 a3) where-  liftRnf2 r r' (x1,x2,x3,x4,x5) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` r x4 `seq` r' x5+-- | @since 1.4.3.0+instance+  (NFData a1) =>+  NFData2 ((,,) a1)+  where+  liftRnf2 r r' (x1, x2, x3) =+    rnf x1 `seq` r x2 `seq` r' x3 -instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) =>-         NFData (a1, a2, a3, a4, a5, a6) where rnf = rnf2--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>-         NFData1 ((,,,,,) a1 a2 a3 a4 a5) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4) =>-         NFData2 ((,,,,,) a1 a2 a3 a4) where-  liftRnf2 r r' (x1,x2,x3,x4,x5,x6) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` r x5 `seq` r' x6+instance+  (NFData a1, NFData a2, NFData a3, NFData a4) =>+  NFData (a1, a2, a3, a4)+  where+  rnf = rnf2 -instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) =>-         NFData (a1, a2, a3, a4, a5, a6, a7) where rnf = rnf2--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) =>-         NFData1 ((,,,,,,) a1 a2 a3 a4 a5 a6) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>-         NFData2 ((,,,,,,) a1 a2 a3 a4 a5) where-  liftRnf2 r r' (x1,x2,x3,x4,x5,x6,x7) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` r x6 `seq` r' x7+-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3) =>+  NFData1 ((,,,) a1 a2 a3)+  where+  liftRnf = liftRnf2 rnf -instance (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) where rnf = rnf2--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) =>-         NFData1 ((,,,,,,,) a1 a2 a3 a4 a5 a6 a7) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) =>-         NFData2 ((,,,,,,,) a1 a2 a3 a4 a5 a6) where-  liftRnf2 r r' (x1,x2,x3,x4,x5,x6,x7,x8) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` r x7 `seq` r' x8+-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2) =>+  NFData2 ((,,,) a1 a2)+  where+  liftRnf2 r r' (x1, x2, x3, x4) =+    rnf x1 `seq` rnf x2 `seq` r x3 `seq` r' x4 -instance (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) where rnf = rnf2--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8) =>-         NFData1 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8) where liftRnf = liftRnf2 rnf--- |@since 1.4.3.0-instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) =>-         NFData2 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7) where-  liftRnf2 r r' (x1,x2,x3,x4,x5,x6,x7,x8,x9) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` r x8 `seq` r' x9+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>+  NFData (a1, a2, a3, a4, a5)+  where+  rnf = rnf2 +-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4) =>+  NFData1 ((,,,,) a1 a2 a3 a4)+  where+  liftRnf = liftRnf2 rnf++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3) =>+  NFData2 ((,,,,) a1 a2 a3)+  where+  liftRnf2 r r' (x1, x2, x3, x4, x5) =+    rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` r x4 `seq` r' x5++instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) =>+  NFData (a1, a2, a3, a4, a5, a6)+  where+  rnf = rnf2++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>+  NFData1 ((,,,,,) a1 a2 a3 a4 a5)+  where+  liftRnf = liftRnf2 rnf++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4) =>+  NFData2 ((,,,,,) a1 a2 a3 a4)+  where+  liftRnf2 r r' (x1, x2, x3, x4, x5, x6) =+    rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` r x5 `seq` r' x6++instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) =>+  NFData (a1, a2, a3, a4, a5, a6, a7)+  where+  rnf = rnf2++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) =>+  NFData1 ((,,,,,,) a1 a2 a3 a4 a5 a6)+  where+  liftRnf = liftRnf2 rnf++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>+  NFData2 ((,,,,,,) a1 a2 a3 a4 a5)+  where+  liftRnf2 r r' (x1, x2, x3, x4, x5, x6, x7) =+    rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` r x6 `seq` r' x7++instance+  (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)+  where+  rnf = rnf2++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) =>+  NFData1 ((,,,,,,,) a1 a2 a3 a4 a5 a6 a7)+  where+  liftRnf = liftRnf2 rnf++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) =>+  NFData2 ((,,,,,,,) a1 a2 a3 a4 a5 a6)+  where+  liftRnf2 r r' (x1, x2, x3, x4, x5, x6, x7, x8) =+    rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` r x7 `seq` r' x8++instance+  (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)+  where+  rnf = rnf2++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8) =>+  NFData1 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8)+  where+  liftRnf = liftRnf2 rnf++-- | @since 1.4.3.0+instance+  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) =>+  NFData2 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7)+  where+  liftRnf2 r r' (x1, x2, x3, x4, x5, x6, x7, x8, x9) =+    rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` r x8 `seq` r' x9+ ---------------------------------------------------------------------------- -- ByteArray -#if BYTEARRAY_IN_BASE+#if MIN_VERSION_base(4,17,0) -- |@since 1.4.7.0 instance NFData ByteArray where   rnf (ByteArray _) = ()
− Control/DeepSeq/BackDoor.hs
@@ -1,33 +0,0 @@-{-# LANGUAGE CPP #-}---- | Hack to keep Control.DeepSeq SAFE-inferred------ This module only re-export reasonably safe entities from non-safe--- modules when there is no safe alternative--#if MIN_VERSION_base(4,9,0) || (MIN_VERSION_base(4,6,0) && !MIN_VERSION_base(4,7,0))-{-# LANGUAGE Safe #-}--module Control.DeepSeq.BackDoor-       {-# WARNING "This module is empty! Do not import me!" #-}-       () where--#else-{-# LANGUAGE Trustworthy #-}--module Control.DeepSeq.BackDoor-    ( module X-    ) where--#if !(MIN_VERSION_base(4,6,0))--- not SAFE-import GHC.Exts as X ( Down(Down) )-#endif--#if MIN_VERSION_base(4,10,0)--- Data.Type.Equality SAFE starting with base-4.10-#elif MIN_VERSION_base(4,7,0)-import Data.Type.Equality as X ( (:~:) )-#endif--#endif
changelog.md view
@@ -2,6 +2,28 @@  ## Upcoming +++## 1.6.0.0++  * Add Unit monoid with `seq`+    ([#18](https://github.com/haskell/deepseq/issues/18), [#105](https://github.com/haskell/deepseq/issues/105))+  * Drop the dependency on `array`+    ([#102](https://github.com/haskell/deepseq/issues/102), [#107](https://github.com/haskell/deepseq/issues/107))++## 1.5.0.0++  * Add quantified superclasses to NFData(1,2)+    ([#88](https://github.com/haskell/deepseq/issues/88))+  * Alter superclasses for Data.Functor.{Sum, Product}+    ([#95])(https://github.com/haskell/deepseq/pull/95)+  * Drop support for GHC < 8.6+    ([#94](https://github.com/haskell/deepseq/pull/94))+  * List fusion in `instance NFData [a]` reduces allocations+    ([#99](https://github.com/haskell/deepseq/pull/99))++## 1.4.8.1+   * Adapt the rename of the Solo constructor to MkSolo     ([#87](https://github.com/haskell/deepseq/pull/87))   * Add instances for the indexed `TypeRep`, along with `Module`.
deepseq.cabal view
@@ -1,6 +1,6 @@ cabal-version:  1.12 name:           deepseq-version:        1.4.8.1+version:        1.6.0.0 -- NOTE: Don't forget to update ./changelog.md  license:        BSD3@@ -26,14 +26,15 @@  build-type:     Simple tested-with:-  GHC==9.4.3,-  GHC==9.2.5,+  GHC==9.10.1,+  GHC==9.8.2,+  GHC==9.6.6,+  GHC==9.4.8,+  GHC==9.2.8,   GHC==9.0.2,   GHC==8.10.7,-  GHC==8.6.5,-  GHC==8.4.4,-  GHC==8.2.2,-  GHC==8.0.2+  GHC==8.8.4,+  GHC==8.6.5  extra-source-files: changelog.md @@ -60,12 +61,10 @@   if impl(ghc >=9.0)     build-depends: ghc-prim -  build-depends: base       >= 4.9 && < 4.19,-                 array      >= 0.4 && < 0.6+  build-depends: base       >= 4.12 && < 4.21   ghc-options: -Wall    exposed-modules: Control.DeepSeq-  other-modules:   Control.DeepSeq.BackDoor  test-suite test   Default-Language: Haskell2010@@ -73,7 +72,6 @@   main-is: Main.hs   type: exitcode-stdio-1.0   build-depends:-    array,     base,     deepseq,     ghc-prim
tests/Main.hs view
@@ -1,6 +1,4 @@ -- Code reused from http://hackage.haskell.org/package/deepseq-generics--{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TupleSections #-}@@ -8,6 +6,8 @@ module Main (main) where  import Control.Concurrent.MVar+-- IUT+import Control.DeepSeq import Control.Exception import Control.Monad import Data.Bits@@ -18,19 +18,6 @@ import System.Exit (exitFailure) import System.IO.Unsafe (unsafePerformIO) --- IUT-import Control.DeepSeq---- needed for GHC-7.4 compatibility-#if !MIN_VERSION_base(4,6,0)-atomicModifyIORef' :: IORef a -> (a -> (a,b)) -> IO b-atomicModifyIORef' ref f = do-    b <- atomicModifyIORef ref-            (\x -> let (a, b) = f x-                    in (a, a `seq` b))-    b `seq` return b-#endif- ---------------------------------------------------------------------------- -- simple hacky abstraction for testing forced evaluation via `rnf`-like functions @@ -40,16 +27,17 @@  withSeqState :: Word64 -> IO () -> IO () withSeqState expectedState act = withMVar seqStateLock $ \() -> do-    0  <- resetSeqState-    () <- act-    st <- resetSeqState-    unless (st == expectedState) $ do-        putStrLn $ "withSeqState: actual seq-state (" ++-                   show st ++-                   ") doesn't match expected value (" ++-                   show expectedState ++-                   ")"-        exitFailure+  0 <- resetSeqState+  () <- act+  st <- resetSeqState+  unless (st == expectedState) $ do+    putStrLn $+      "withSeqState: actual seq-state ("+        ++ show st+        ++ ") doesn't match expected value ("+        ++ show expectedState+        ++ ")"+    exitFailure  seqState :: IORef Word64 seqState = unsafePerformIO $ newIORef 0@@ -58,24 +46,26 @@ resetSeqState :: IO Word64 resetSeqState = atomicModifyIORef' seqState (0,) --- |Set flag and raise exception is flag already set+-- | Set flag and raise exception is flag already set setSeqState :: Int -> IO ()-setSeqState i | 0 <= i && i < 64 = atomicModifyIORef' seqState go-              | otherwise        = error "seqSeqState: flag index must be in [0..63]"-  where-    go x | testBit x i = error ("setSeqState: flag #"++show i++" already set")-         | otherwise   = (setBit x i, ())+setSeqState i+  | 0 <= i && i < 64 = atomicModifyIORef' seqState go+  | otherwise = error "seqSeqState: flag index must be in [0..63]"+ where+  go x+    | testBit x i = error ("setSeqState: flag #" ++ show i ++ " already set")+    | otherwise = (setBit x i, ())  -- weird type whose NFData instance calls 'setSeqState' when rnf-ed data SeqSet = SeqSet !Int | SeqIgnore-              deriving Show+  deriving (Show)  instance NFData SeqSet where-    rnf (SeqSet i)  = unsafePerformIO $ setSeqState i-    rnf (SeqIgnore) = ()-    {-# NOINLINE rnf #-}+  rnf (SeqSet i) = unsafePerformIO $ setSeqState i+  rnf (SeqIgnore) = ()+  {-# NOINLINE rnf #-} --- |Exception to be thrown for testing 'seq'/'rnf'+-- | Exception to be thrown for testing 'seq'/'rnf' data RnfEx = RnfEx deriving (Eq, Show, Typeable)  instance Exception RnfEx@@ -84,108 +74,112 @@  assertRnfEx :: () -> IO () assertRnfEx v = handleJust isWanted (const $ return ()) $ do-    () <- evaluate v-    putStrLn "failed to trigger expected RnfEx exception"-    exitFailure-  where isWanted = guard . (== RnfEx)+  () <- evaluate v+  putStrLn "failed to trigger expected RnfEx exception"+  exitFailure+ where+  isWanted = guard . (== RnfEx)  ----------------------------------------------------------------------------  testCase :: String -> IO a -> IO a testCase testName io = do-    putStrLn testName-    io+  putStrLn testName+  io  case_1, case_2, case_3 :: IO () case_4_1, case_4_2, case_4_3, case_4_4 :: IO ()-#if __GLASGOW_HASKELL__ >= 706 case_4_1b, case_4_2b, case_4_3b, case_4_4b :: IO ()-#endif  newtype Case1 = Case1 Int-              deriving (Generic)+  deriving (Generic)  instance NFData Case1  case_1 = testCase "Case1" $ do-    assertRnfEx $ rnf $ (Case1 (throw RnfEx))+  assertRnfEx $ rnf $ (Case1 (throw RnfEx))  ----  data Case2 = Case2 Int-           deriving (Generic)+  deriving (Generic)  instance NFData Case2  case_2 = testCase "Case2" $ do-    assertRnfEx $ rnf $ (Case2 (throw RnfEx))+  assertRnfEx $ rnf $ (Case2 (throw RnfEx))  ----  data Case3 = Case3 RnfEx-           deriving (Generic)+  deriving (Generic)  instance NFData Case3  case_3 = testCase "Case3" $ do-    assertRnfEx $ rnf $ Case3 RnfEx+  assertRnfEx $ rnf $ Case3 RnfEx  ---- -data Case4 a = Case4a-             | Case4b a a-             | Case4c a (Case4 a)-             deriving ( Generic-#if __GLASGOW_HASKELL__ >= 706-                      , Generic1-#endif-                      )+data Case4 a+  = Case4a+  | Case4b a a+  | Case4c a (Case4 a)+  deriving+    ( Generic+    , Generic1+    )  instance NFData a => NFData (Case4 a) -#if __GLASGOW_HASKELL__ >= 706 instance NFData1 Case4-#endif  case_4_1 = testCase "Case4.1" $ withSeqState 0x0 $ do-    evaluate $ rnf $ (Case4a :: Case4 SeqSet)+  evaluate $ rnf $ (Case4a :: Case4 SeqSet)  case_4_2 = testCase "Case4.2" $ withSeqState 0x3 $ do-    evaluate $ rnf $ (Case4b (SeqSet 0) (SeqSet 1) :: Case4 SeqSet)+  evaluate $ rnf $ (Case4b (SeqSet 0) (SeqSet 1) :: Case4 SeqSet)  case_4_3 = testCase "Case4.3" $ withSeqState (bit 55) $ do-    evaluate $ rnf $ (Case4b SeqIgnore (SeqSet 55) :: Case4 SeqSet)+  evaluate $ rnf $ (Case4b SeqIgnore (SeqSet 55) :: Case4 SeqSet)  case_4_4 = testCase "Case4.4" $ withSeqState 0xffffffffffffffff $ do-    evaluate $ rnf $ (genCase 63)-  where-    genCase n | n > 1      = Case4c (SeqSet n) (genCase (n-1))-              | otherwise  = Case4b (SeqSet 0) (SeqSet 1)+  evaluate $ rnf $ (genCase 63)+ where+  genCase n+    | n > 1 = Case4c (SeqSet n) (genCase (n - 1))+    | otherwise = Case4b (SeqSet 0) (SeqSet 1) -#if __GLASGOW_HASKELL__ >= 706 case_4_1b = testCase "Case4.1b" $ withSeqState 0x0 $ do-    evaluate $ rnf1 $ (Case4a :: Case4 SeqSet)+  evaluate $ rnf1 $ (Case4a :: Case4 SeqSet)  case_4_2b = testCase "Case4.2b" $ withSeqState 0x3 $ do-    evaluate $ rnf1 $ (Case4b (SeqSet 0) (SeqSet 1) :: Case4 SeqSet)+  evaluate $ rnf1 $ (Case4b (SeqSet 0) (SeqSet 1) :: Case4 SeqSet)  case_4_3b = testCase "Case4.3b" $ withSeqState (bit 55) $ do-    evaluate $ rnf1 $ (Case4b SeqIgnore (SeqSet 55) :: Case4 SeqSet)+  evaluate $ rnf1 $ (Case4b SeqIgnore (SeqSet 55) :: Case4 SeqSet)  case_4_4b = testCase "Case4.4b" $ withSeqState 0xffffffffffffffff $ do-    evaluate $ rnf1 $ (genCase 63)-  where-    genCase n | n > 1      = Case4c (SeqSet n) (genCase (n-1))-              | otherwise  = Case4b (SeqSet 0) (SeqSet 1)-#endif+  evaluate $ rnf1 $ (genCase 63)+ where+  genCase n+    | n > 1 = Case4c (SeqSet n) (genCase (n - 1))+    | otherwise = Case4b (SeqSet 0) (SeqSet 1)  ----------------------------------------------------------------------------  main :: IO ()-main = sequence_-  [ case_1, case_2, case_3-  , case_4_1, case_4_2, case_4_3, case_4_4-#if __GLASGOW_HASKELL__ >= 706-  , case_4_1b, case_4_2b, case_4_3b, case_4_4b-#endif-  ]+main =+  sequence_+    [ case_1+    , case_2+    , case_3+    , case_4_1+    , case_4_2+    , case_4_3+    , case_4_4+    , case_4_1b+    , case_4_2b+    , case_4_3b+    , case_4_4b+    ]