{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe #-}
{-# 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
-- License     :  BSD-style (see the file LICENSE)
--
-- Maintainer  :  libraries@haskell.org
-- Stability   :  stable
-- Portability :  portable
--
-- This module provides overloaded functions, such as 'deepseq' and
-- 'rnf', for fully evaluating data structures (that is, evaluating to
-- \"Normal Form\").
--
-- A typical use is to prevent resource leaks in lazy IO programs, by
-- forcing all characters from a file to be read. For example:
--
-- > import System.IO
-- > import Control.DeepSeq
-- > import Control.Exception (evaluate)
-- >
-- > readFile' :: FilePath -> IO String
-- > readFile' fn = do
-- >     h <- openFile fn ReadMode
-- >     s <- hGetContents h
-- >     evaluate (rnf s)
-- >     hClose h
-- >     return s
--
-- __Note__: The example above should rather be written in terms of
-- 'Control.Exception.bracket' to ensure releasing file-descriptors in
-- a timely matter (see the description of 'force' for an example).
--
-- 'deepseq' differs from 'seq' as it traverses data structures deeply,
-- for example, 'seq' will evaluate only to the first constructor in
-- the list:
--
-- > > [1,2,undefined] `seq` 3
-- > 3
--
-- While 'deepseq' will force evaluation of all the list elements:
--
-- > > [1,2,undefined] `deepseq` 3
-- > *** Exception: Prelude.undefined
--
-- Another common use is to ensure any exceptions hidden within lazy
-- fields of a data structure do not leak outside the scope of the
-- exception handler, or to force evaluation of a data structure in one
-- thread, before passing to another thread (preventing work moving to
-- the wrong threads).
--
-- @since 1.1.0.0
module Control.DeepSeq (
     -- * 'NFData' class
     NFData(rnf),
     -- * Helper functions
     deepseq,
     force,
     ($!!),
     (<$!!>),
     rwhnf,

     -- * 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 Data.IORef
import Data.STRef
import Data.Int
import Data.Word
import Data.Ratio
import Data.Complex
import Data.Array
import Data.Fixed
import Data.Version
import Data.Monoid as Mon
import Data.Typeable ( TypeRep, TyCon )
import Data.Unique ( Unique )
import Foreign.Ptr
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 ( (:~:), (:~~:) )
#else
import Data.Type.Equality ( (:~:) )
#endif

import Data.Functor.Identity ( Identity(..) )
import Data.Typeable ( rnfTypeRep, rnfTyCon )
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 GHC.Generics

#ifdef MIN_VERSION_ghc_prim
#if MIN_VERSION_ghc_prim(0,7,0)
import GHC.Tuple (Solo (..))
#endif
#endif

#if BYTEARRAY_IN_BASE
import Data.Array.Byte (ByteArray(..))
#endif

-- | Hidden internal type-class
class GNFData arity f where
  grnf :: RnfArgs arity a -> f a -> ()

instance GNFData arity V1 where
  grnf :: RnfArgs arity a -> V1 a -> ()
grnf RnfArgs arity a
_ V1 a
x = case V1 a
x of {}

data Zero
data One

data RnfArgs arity a where
  RnfArgs0 :: RnfArgs Zero a
  RnfArgs1  :: (a -> ()) -> RnfArgs One a

instance GNFData arity U1 where
  grnf :: RnfArgs arity a -> U1 a -> ()
grnf RnfArgs arity a
_ U1 a
U1 = ()

instance NFData a => GNFData arity (K1 i a) where
  grnf :: RnfArgs arity a -> K1 i a a -> ()
grnf RnfArgs arity a
_ = a -> ()
forall a. NFData a => a -> ()
rnf (a -> ()) -> (K1 i a a -> a) -> K1 i a a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. K1 i a a -> a
forall i c k (p :: k). K1 i c p -> c
unK1
  {-# INLINEABLE grnf #-}

instance GNFData arity a => GNFData arity (M1 i c a) where
  grnf :: RnfArgs arity a -> M1 i c a a -> ()
grnf RnfArgs arity a
args = RnfArgs arity a -> a a -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf RnfArgs arity a
args (a a -> ()) -> (M1 i c a a -> a a) -> M1 i c a a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M1 i c a a -> a a
forall i (c :: Meta) k (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
  {-# INLINEABLE grnf #-}

instance GNFData arity (URec a) where
  grnf :: RnfArgs arity a -> URec a a -> ()
grnf RnfArgs arity a
_ = URec a a -> ()
forall a. a -> ()
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.
  {-# INLINEABLE grnf #-}

instance (GNFData arity a, GNFData arity b) => GNFData arity (a :*: b) where
  grnf :: RnfArgs arity a -> (:*:) a b a -> ()
grnf RnfArgs arity a
args (a a
x :*: b a
y) = RnfArgs arity a -> a a -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf RnfArgs arity a
args a a
x () -> () -> ()
`seq` RnfArgs arity a -> b a -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf RnfArgs arity a
args b a
y
  {-# INLINEABLE grnf #-}

instance (GNFData arity a, GNFData arity b) => GNFData arity (a :+: b) where
  grnf :: RnfArgs arity a -> (:+:) a b a -> ()
grnf RnfArgs arity a
args (L1 a a
x) = RnfArgs arity a -> a a -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf RnfArgs arity a
args a a
x
  grnf RnfArgs arity a
args (R1 b a
x) = RnfArgs arity a -> b a -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf RnfArgs arity a
args b a
x
  {-# INLINEABLE grnf #-}

instance GNFData One Par1 where
    grnf :: RnfArgs One a -> Par1 a -> ()
grnf (RnfArgs1 a -> ()
r) = a -> ()
r (a -> ()) -> (Par1 a -> a) -> Par1 a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Par1 a -> a
forall p. Par1 p -> p
unPar1

instance NFData1 f => GNFData One (Rec1 f) where
    grnf :: RnfArgs One a -> Rec1 f a -> ()
grnf (RnfArgs1 a -> ()
r) = (a -> ()) -> f a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r (f a -> ()) -> (Rec1 f a -> f a) -> Rec1 f a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec1 f a -> f a
forall k (f :: k -> *) (p :: k). Rec1 f p -> f p
unRec1

instance (NFData1 f, GNFData One g) => GNFData One (f :.: g) where
    grnf :: RnfArgs One a -> (:.:) f g a -> ()
grnf RnfArgs One a
args = (g a -> ()) -> f (g a) -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf (RnfArgs One a -> g a -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf RnfArgs One a
args) (f (g a) -> ()) -> ((:.:) f g a -> f (g a)) -> (:.:) f g a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:.:) f g a -> f (g a)
forall k2 (f :: k2 -> *) k1 (g :: k1 -> k2) (p :: k1).
(:.:) f g p -> f (g p)
unComp1

infixr 0 $!!
infixr 0 `deepseq`

-- | 'deepseq': fully evaluates the first argument, before returning the
-- second.
--
-- The name 'deepseq' is used to illustrate the relationship to 'seq':
-- where 'seq' is shallow in the sense that it only evaluates the top
-- level of its argument, 'deepseq' traverses the entire data structure
-- evaluating it completely.
--
-- 'deepseq' can be useful for forcing pending exceptions,
-- eradicating space leaks, or forcing lazy I/O to happen.  It is
-- also useful in conjunction with parallel Strategies (see the
-- @parallel@ package).
--
-- There is no guarantee about the ordering of evaluation.  The
-- implementation may evaluate the components of the structure in
-- any order or in parallel.  To impose an actual order on
-- evaluation, use 'pseq' from "Control.Parallel" in the
-- @parallel@ package.
--
-- @since 1.1.0.0
deepseq :: NFData a => a -> b -> b
deepseq :: a -> b -> b
deepseq a
a b
b = a -> ()
forall a. NFData a => a -> ()
rnf a
a () -> b -> b
`seq` b
b

-- | the deep analogue of '$!'.  In the expression @f $!! x@, @x@ is
-- fully evaluated before the function @f@ is applied to it.
--
-- @since 1.2.0.0
($!!) :: (NFData a) => (a -> b) -> a -> b
a -> b
f $!! :: (a -> b) -> a -> b
$!! a
x = a
x a -> b -> b
forall a b. NFData a => a -> b -> b
`deepseq` a -> b
f a
x

-- | 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
-- 'Control.Exception.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 1.2.0.0
force :: (NFData a) => a -> a
force :: a -> a
force a
x = a
x a -> a -> a
forall a b. NFData a => a -> b -> b
`deepseq` a
x

-- | Deeply strict version of 'Control.Applicative.<$>'.
--
-- @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
a -> b
f <$!!> :: (a -> b) -> m a -> m b
<$!!> m a
m = m a
m m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
x -> b -> m b
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b -> m b) -> b -> m b
forall a b. NFData a => (a -> b) -> a -> b
$!! a -> b
f a
x
#else
f <$!!> m = m >>= \x -> return $!! f x
#endif
infixl 4 <$!!>

-- | Reduce to weak head normal form
--
-- Equivalent to @\\x -> 'seq' x ()@.
--
-- Useful for defining 'NFData' for types for which NF=WHNF holds.
--
-- > data T = C1 | C2 | C3
-- > instance NFData T where rnf = rwhnf
--
-- @since 1.4.3.0
rwhnf :: a -> ()
rwhnf :: a -> ()
rwhnf = (a -> () -> ()
`seq` ())
{-# INLINE rwhnf #-}

-- Note: the 'rwhnf' is defined point-free to help aggressive inlining

-- | A class of types that can be fully evaluated.
--
-- @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 = RnfArgs Zero Any -> Rep a Any -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf RnfArgs Zero Any
forall a. RnfArgs Zero a
RnfArgs0 (Rep a Any -> ()) -> (a -> Rep a Any) -> a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Rep a Any
forall a x. Generic a => a -> Rep a x
from

-- | A class of functors that can be fully evaluated.
--
-- @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 a -> ()
r = RnfArgs One a -> Rep1 f a -> ()
forall arity (f :: * -> *) a.
GNFData arity f =>
RnfArgs arity a -> f a -> ()
grnf ((a -> ()) -> RnfArgs One a
forall a. (a -> ()) -> RnfArgs One a
RnfArgs1 a -> ()
r) (Rep1 f a -> ()) -> (f a -> Rep1 f a) -> f a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> Rep1 f a
forall k (f :: k -> *) (a :: k). Generic1 f => f a -> Rep1 f a
from1

-- | Lift the standard 'rnf' function through the type constructor.
--
-- @since 1.4.3.0
rnf1 :: (NFData1 f, NFData a) => f a -> ()
rnf1 :: f a -> ()
rnf1 = (a -> ()) -> f a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
forall a. NFData a => a -> ()
rnf

-- | A class of bifunctors that can be fully evaluated.
--
-- @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 -> ()

-- | Lift the standard 'rnf' function through the type constructor.
--
-- @since 1.4.3.0
rnf2 :: (NFData2 p, NFData a, NFData b) => p a b -> ()
rnf2 :: p a b -> ()
rnf2 = (a -> ()) -> (b -> ()) -> p a b -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a -> ()
forall a. NFData a => a -> ()
rnf b -> ()
forall a. NFData a => a -> ()
rnf


instance NFData Int      where rnf :: Int -> ()
rnf = Int -> ()
forall a. a -> ()
rwhnf
instance NFData Word     where rnf :: Word -> ()
rnf = Word -> ()
forall a. a -> ()
rwhnf
instance NFData Integer  where rnf :: Integer -> ()
rnf = Integer -> ()
forall a. a -> ()
rwhnf
instance NFData Float    where rnf :: Float -> ()
rnf = Float -> ()
forall a. a -> ()
rwhnf
instance NFData Double   where rnf :: Double -> ()
rnf = Double -> ()
forall a. a -> ()
rwhnf

instance NFData Char     where rnf :: Char -> ()
rnf = Char -> ()
forall a. a -> ()
rwhnf
instance NFData Bool     where rnf :: Bool -> ()
rnf = Bool -> ()
forall a. a -> ()
rwhnf
instance NFData Ordering where rnf :: Ordering -> ()
rnf = Ordering -> ()
forall a. a -> ()
rwhnf
instance NFData ()       where rnf :: () -> ()
rnf = () -> ()
forall a. a -> ()
rwhnf

instance NFData Int8     where rnf :: Int8 -> ()
rnf = Int8 -> ()
forall a. a -> ()
rwhnf
instance NFData Int16    where rnf :: Int16 -> ()
rnf = Int16 -> ()
forall a. a -> ()
rwhnf
instance NFData Int32    where rnf :: Int32 -> ()
rnf = Int32 -> ()
forall a. a -> ()
rwhnf
instance NFData Int64    where rnf :: Int64 -> ()
rnf = Int64 -> ()
forall a. a -> ()
rwhnf

instance NFData Word8    where rnf :: Word8 -> ()
rnf = Word8 -> ()
forall a. a -> ()
rwhnf
instance NFData Word16   where rnf :: Word16 -> ()
rnf = Word16 -> ()
forall a. a -> ()
rwhnf
instance NFData Word32   where rnf :: Word32 -> ()
rnf = Word32 -> ()
forall a. a -> ()
rwhnf
instance NFData Word64   where rnf :: Word64 -> ()
rnf = Word64 -> ()
forall a. a -> ()
rwhnf

-- | @since 1.4.4.0
instance NFData MaskingState where rnf :: MaskingState -> ()
rnf = MaskingState -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData (Proxy a) where rnf :: Proxy a -> ()
rnf Proxy a
Proxy = ()
-- |@since 1.4.3.0
instance NFData1 Proxy    where liftRnf :: (a -> ()) -> Proxy a -> ()
liftRnf a -> ()
_ Proxy a
Proxy = ()

-- | @since 1.4.3.0
instance NFData (a :~: b) where rnf :: (a :~: b) -> ()
rnf = (a :~: b) -> ()
forall a. a -> ()
rwhnf
-- | @since 1.4.3.0
instance NFData1 ((:~:) a) where liftRnf :: (a -> ()) -> (a :~: a) -> ()
liftRnf a -> ()
_ = (a :~: a) -> ()
forall a. a -> ()
rwhnf
-- | @since 1.4.3.0
instance NFData2 (:~:) where liftRnf2 :: (a -> ()) -> (b -> ()) -> (a :~: b) -> ()
liftRnf2 a -> ()
_ b -> ()
_ = (a :~: b) -> ()
forall a. a -> ()
rwhnf

#if MIN_VERSION_base(4,10,0)
-- | @since 1.4.3.0
instance NFData (a :~~: b) where rnf :: (a :~~: b) -> ()
rnf = (a :~~: b) -> ()
forall a. a -> ()
rwhnf
-- | @since 1.4.3.0
instance NFData1 ((:~~:) a) where liftRnf :: (a -> ()) -> (a :~~: a) -> ()
liftRnf a -> ()
_ = (a :~~: a) -> ()
forall a. a -> ()
rwhnf
-- | @since 1.4.3.0
instance NFData2 (:~~:) where liftRnf2 :: (a -> ()) -> (b -> ()) -> (a :~~: b) -> ()
liftRnf2 a -> ()
_ b -> ()
_ = (a :~~: b) -> ()
forall a. a -> ()
rwhnf
#endif

-- |@since 1.4.0.0
instance NFData a => NFData (Identity a) where
    rnf :: Identity a -> ()
rnf = Identity a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1

-- |@since 1.4.3.0
instance NFData1 Identity where
    liftRnf :: (a -> ()) -> Identity a -> ()
liftRnf a -> ()
r = a -> ()
r (a -> ()) -> (Identity a -> a) -> Identity a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity a -> a
forall a. Identity a -> a
runIdentity

-- | Defined as @'rnf' = 'absurd'@.
--
-- @since 1.4.0.0
instance NFData Void where
    rnf :: Void -> ()
rnf = Void -> ()
forall a. Void -> a
absurd

-- |@since 1.4.0.0
instance NFData Natural  where rnf :: Natural -> ()
rnf = Natural -> ()
forall a. a -> ()
rwhnf

-- |@since 1.3.0.0
instance NFData (Fixed a) where rnf :: Fixed a -> ()
rnf = Fixed a -> ()
forall a. a -> ()
rwhnf
-- |@since 1.4.3.0
instance NFData1 Fixed where liftRnf :: (a -> ()) -> Fixed a -> ()
liftRnf a -> ()
_ = Fixed a -> ()
forall a. a -> ()
rwhnf

-- |This instance is for convenience and consistency with 'seq'.
-- This assumes that WHNF is equivalent to NF for functions.
--
-- @since 1.3.0.0
instance NFData (a -> b) where rnf :: (a -> b) -> ()
rnf = (a -> b) -> ()
forall a. a -> ()
rwhnf

--Rational and complex numbers.

-- | Available on @base >=4.9@
--
-- @since 1.4.3.0
instance NFData1 Ratio where
  liftRnf :: (a -> ()) -> Ratio a -> ()
liftRnf a -> ()
r Ratio a
x = a -> ()
r (Ratio a -> a
forall a. Ratio a -> a
numerator Ratio a
x) () -> () -> ()
`seq` a -> ()
r (Ratio a -> a
forall a. Ratio a -> a
denominator Ratio a
x)

-- | @since 1.4.3.0
instance (NFData1 f, NFData1 g) => NFData1 (Compose f g) where
  liftRnf :: (a -> ()) -> Compose f g a -> ()
liftRnf a -> ()
r = (g a -> ()) -> f (g a) -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf ((a -> ()) -> g a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r) (f (g a) -> ())
-> (Compose f g a -> f (g a)) -> Compose f g a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compose f g a -> f (g a)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose

-- | @since 1.4.3.0
instance (NFData1 f, NFData1 g, NFData a) => NFData (Compose f g a) where
  rnf :: Compose f g a -> ()
rnf = Compose f g a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1

-- | @since 1.4.3.0
instance (NFData1 f, NFData1 g) => NFData1 (Functor.Sum f g) where
  liftRnf :: (a -> ()) -> Sum f g a -> ()
liftRnf a -> ()
rnf0 (Functor.InL f a
l) = (a -> ()) -> f a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
rnf0 f a
l
  liftRnf a -> ()
rnf0 (Functor.InR g a
r) = (a -> ()) -> g a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
rnf0 g a
r

-- | @since 1.4.3.0
instance (NFData1 f, NFData1 g, NFData a) => NFData (Functor.Sum f g a) where
  rnf :: Sum f g a -> ()
rnf = Sum f g a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1

-- | @since 1.4.3.0
instance (NFData1 f, NFData1 g) => NFData1 (Functor.Product f g) where
  liftRnf :: (a -> ()) -> Product f g a -> ()
liftRnf a -> ()
rnf0 (Functor.Pair f a
f g a
g) = (a -> ()) -> f a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
rnf0 f a
f () -> () -> ()
`seq` (a -> ()) -> g a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
rnf0 g a
g

-- | @since 1.4.3.0
instance (NFData1 f, NFData1 g, NFData a) => NFData (Functor.Product f g a) where
  rnf :: Product f g a -> ()
rnf = Product f g a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1

instance NFData a => NFData (Ratio a) where
  rnf :: Ratio a -> ()
rnf Ratio a
x = (a, a) -> ()
forall a. NFData a => a -> ()
rnf (Ratio a -> a
forall a. Ratio a -> a
numerator Ratio a
x, Ratio a -> a
forall a. Ratio a -> a
denominator Ratio a
x)

instance (NFData a) => NFData (Complex a) where
  rnf :: Complex a -> ()
rnf (a
x:+a
y) = a -> ()
forall a. NFData a => a -> ()
rnf a
x () -> () -> ()
`seq`
               a -> ()
forall a. NFData a => a -> ()
rnf a
y () -> () -> ()
`seq`
               ()

instance NFData a => NFData (Maybe a) where rnf :: Maybe a -> ()
rnf = Maybe a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Maybe where
    liftRnf :: (a -> ()) -> Maybe a -> ()
liftRnf a -> ()
_r Maybe a
Nothing  = ()
    liftRnf  a -> ()
r (Just a
x) = a -> ()
r a
x

instance (NFData a, NFData b) => NFData (Either a b) where rnf :: Either a b -> ()
rnf = Either a b -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance (NFData a) => NFData1 (Either a) where liftRnf :: (a -> ()) -> Either a a -> ()
liftRnf = (a -> ()) -> (a -> ()) -> Either a a -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a -> ()
forall a. NFData a => a -> ()
rnf
-- |@since 1.4.3.0
instance NFData2 Either where
    liftRnf2 :: (a -> ()) -> (b -> ()) -> Either a b -> ()
liftRnf2  a -> ()
l b -> ()
_r (Left a
x)  = a -> ()
l a
x
    liftRnf2 a -> ()
_l  b -> ()
r (Right b
y) = b -> ()
r b
y

-- |@since 1.3.0.0
instance NFData Data.Version.Version where
    rnf :: Version -> ()
rnf (Data.Version.Version [Int]
branch [String]
tags) = [Int] -> ()
forall a. NFData a => a -> ()
rnf [Int]
branch () -> () -> ()
`seq` [String] -> ()
forall a. NFData a => a -> ()
rnf [String]
tags

instance NFData a => NFData [a] where rnf :: [a] -> ()
rnf = [a] -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 [] where
    liftRnf :: (a -> ()) -> [a] -> ()
liftRnf a -> ()
r = [a] -> ()
go
      where
        go :: [a] -> ()
go [] = ()
        go (a
x:[a]
xs) = a -> ()
r a
x () -> () -> ()
`seq` [a] -> ()
go [a]
xs

-- |@since 1.4.0.0
instance NFData a => NFData (ZipList a) where rnf :: ZipList a -> ()
rnf = ZipList a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 ZipList where
    liftRnf :: (a -> ()) -> ZipList a -> ()
liftRnf a -> ()
r = (a -> ()) -> [a] -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r ([a] -> ()) -> (ZipList a -> [a]) -> ZipList a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ZipList a -> [a]
forall a. ZipList a -> [a]
getZipList

-- |@since 1.4.0.0
instance NFData a => NFData (Const a b) where
    rnf :: Const a b -> ()
rnf = a -> ()
forall a. NFData a => a -> ()
rnf (a -> ()) -> (Const a b -> a) -> Const a b -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Const a b -> a
forall a k (b :: k). Const a b -> a
getConst
-- |@since 1.4.3.0
instance NFData a => NFData1 (Const a) where
    liftRnf :: (a -> ()) -> Const a a -> ()
liftRnf a -> ()
_ = a -> ()
forall a. NFData a => a -> ()
rnf (a -> ()) -> (Const a a -> a) -> Const a a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Const a a -> a
forall a k (b :: k). Const a b -> a
getConst
-- |@since 1.4.3.0
instance NFData2 Const where
    liftRnf2 :: (a -> ()) -> (b -> ()) -> Const a b -> ()
liftRnf2 a -> ()
r b -> ()
_ = a -> ()
r (a -> ()) -> (Const a b -> a) -> Const a b -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Const a b -> a
forall a k (b :: k). Const a b -> a
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 :: Array a b -> ()
rnf Array a b
x = ((a, a), [b]) -> ()
forall a. NFData a => a -> ()
rnf (Array a b -> (a, a)
forall i e. Array i e -> (i, i)
bounds Array a b
x, Array a b -> [b]
forall i e. Array i e -> [e]
Data.Array.elems Array a b
x)

-- |@since 1.4.3.0
instance (NFData a) => NFData1 (Array a) where
    liftRnf :: (a -> ()) -> Array a a -> ()
liftRnf a -> ()
r Array a a
x = (a, a) -> ()
forall a. NFData a => a -> ()
rnf (Array a a -> (a, a)
forall i e. Array i e -> (i, i)
bounds Array a a
x) () -> () -> ()
`seq` (a -> ()) -> [a] -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r (Array a a -> [a]
forall i e. Array i e -> [e]
Data.Array.elems Array a a
x)

-- |@since 1.4.3.0
instance NFData2 Array where
    liftRnf2 :: (a -> ()) -> (b -> ()) -> Array a b -> ()
liftRnf2 a -> ()
r b -> ()
r' Array a b
x = (a -> ()) -> (a -> ()) -> (a, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a -> ()
r a -> ()
r (Array a b -> (a, a)
forall i e. Array i e -> (i, i)
bounds Array a b
x) () -> () -> ()
`seq` (b -> ()) -> [b] -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf b -> ()
r' (Array a b -> [b]
forall i e. Array i e -> [e]
Data.Array.elems Array a b
x)

-- |@since 1.4.0.0
instance NFData a => NFData (Down a) where rnf :: Down a -> ()
rnf = Down a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Down where
    liftRnf :: (a -> ()) -> Down a -> ()
liftRnf a -> ()
r (Down a
x) = a -> ()
r a
x

-- |@since 1.4.0.0
instance NFData a => NFData (Dual a) where rnf :: Dual a -> ()
rnf = Dual a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Dual where
    liftRnf :: (a -> ()) -> Dual a -> ()
liftRnf a -> ()
r (Dual a
x) = a -> ()
r a
x

-- |@since 1.4.0.0
instance NFData a => NFData (Mon.First a) where rnf :: First a -> ()
rnf = First a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Mon.First  where
    liftRnf :: (a -> ()) -> First a -> ()
liftRnf a -> ()
r (Mon.First Maybe a
x) = (a -> ()) -> Maybe a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r Maybe a
x

-- |@since 1.4.0.0
instance NFData a => NFData (Mon.Last a) where rnf :: Last a -> ()
rnf = Last a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Mon.Last  where
    liftRnf :: (a -> ()) -> Last a -> ()
liftRnf a -> ()
r (Mon.Last  Maybe a
x) = (a -> ()) -> Maybe a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r Maybe a
x

-- |@since 1.4.0.0
instance NFData Any where rnf :: Any -> ()
rnf = Bool -> ()
forall a. NFData a => a -> ()
rnf (Bool -> ()) -> (Any -> Bool) -> Any -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Any -> Bool
getAny

-- |@since 1.4.0.0
instance NFData All where rnf :: All -> ()
rnf = Bool -> ()
forall a. NFData a => a -> ()
rnf (Bool -> ()) -> (All -> Bool) -> All -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. All -> Bool
getAll

-- |@since 1.4.0.0
instance NFData a => NFData (Sum a) where rnf :: Sum a -> ()
rnf = Sum a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Sum where
    liftRnf :: (a -> ()) -> Sum a -> ()
liftRnf a -> ()
r (Sum a
x) = a -> ()
r a
x

-- |@since 1.4.0.0
instance NFData a => NFData (Product a) where rnf :: Product a -> ()
rnf = Product a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Product where
    liftRnf :: (a -> ()) -> Product a -> ()
liftRnf a -> ()
r (Product a
x) = a -> ()
r a
x

-- |@since 1.4.0.0
instance NFData (StableName a) where
    rnf :: StableName a -> ()
rnf = StableName a -> ()
forall a. a -> ()
rwhnf -- assumes `data StableName a = StableName (StableName# a)`
-- |@since 1.4.3.0
instance NFData1 StableName where
    liftRnf :: (a -> ()) -> StableName a -> ()
liftRnf a -> ()
_ = StableName a -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData ThreadId where
    rnf :: ThreadId -> ()
rnf = ThreadId -> ()
forall a. a -> ()
rwhnf -- assumes `data ThreadId = ThreadId ThreadId#`

-- |@since 1.4.0.0
instance NFData Unique where
    rnf :: Unique -> ()
rnf = Unique -> ()
forall a. a -> ()
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 :: TypeRep -> ()
rnf TypeRep
tyrep = TypeRep -> ()
rnfTypeRep TypeRep
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 -> ()
rnf TyCon
tycon = TyCon -> ()
rnfTyCon TyCon
tycon


-- | __NOTE__: Only strict in the reference and not the referenced value.
--
-- @since 1.4.2.0
instance NFData (IORef a) where
    rnf :: IORef a -> ()
rnf = IORef a -> ()
forall a. a -> ()
rwhnf
-- |@since 1.4.3.0
instance NFData1 IORef where
    liftRnf :: (a -> ()) -> IORef a -> ()
liftRnf a -> ()
_ = IORef a -> ()
forall a. a -> ()
rwhnf

-- | __NOTE__: Only strict in the reference and not the referenced value.
--
-- @since 1.4.2.0
instance NFData (STRef s a) where
    rnf :: STRef s a -> ()
rnf = STRef s a -> ()
forall a. a -> ()
rwhnf
-- |@since 1.4.3.0
instance NFData1 (STRef s) where
    liftRnf :: (a -> ()) -> STRef s a -> ()
liftRnf a -> ()
_ = STRef s a -> ()
forall a. a -> ()
rwhnf
-- |@since 1.4.3.0
instance NFData2 STRef where
    liftRnf2 :: (a -> ()) -> (b -> ()) -> STRef a b -> ()
liftRnf2 a -> ()
_ b -> ()
_ = STRef a b -> ()
forall a. a -> ()
rwhnf

-- | __NOTE__: Only strict in the reference and not the referenced value.
--
-- @since 1.4.2.0
instance NFData (MVar a) where
  rnf :: MVar a -> ()
rnf = MVar a -> ()
forall a. a -> ()
rwhnf
-- |@since 1.4.3.0
instance NFData1 MVar where
    liftRnf :: (a -> ()) -> MVar a -> ()
liftRnf a -> ()
_ = MVar a -> ()
forall a. a -> ()
rwhnf

----------------------------------------------------------------------------
-- GHC Specifics

-- |@since 1.4.0.0
instance NFData Fingerprint where
    rnf :: Fingerprint -> ()
rnf (Fingerprint Word64
_ Word64
_) = ()

----------------------------------------------------------------------------
-- Foreign.Ptr

-- |@since 1.4.2.0
instance NFData (Ptr a) where
    rnf :: Ptr a -> ()
rnf = Ptr a -> ()
forall a. a -> ()
rwhnf
-- |@since 1.4.3.0
instance NFData1 Ptr where
    liftRnf :: (a -> ()) -> Ptr a -> ()
liftRnf a -> ()
_ = Ptr a -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.2.0
instance NFData (FunPtr a) where
    rnf :: FunPtr a -> ()
rnf = FunPtr a -> ()
forall a. a -> ()
rwhnf
-- |@since 1.4.3.0
instance NFData1 FunPtr where
    liftRnf :: (a -> ()) -> FunPtr a -> ()
liftRnf a -> ()
_ = FunPtr a -> ()
forall a. a -> ()
rwhnf

----------------------------------------------------------------------------
-- Foreign.C.Types

-- |@since 1.4.0.0
instance NFData CChar where rnf :: CChar -> ()
rnf = CChar -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CSChar where rnf :: CSChar -> ()
rnf = CSChar -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CUChar where rnf :: CUChar -> ()
rnf = CUChar -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CShort where rnf :: CShort -> ()
rnf = CShort -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CUShort where rnf :: CUShort -> ()
rnf = CUShort -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CInt where rnf :: CInt -> ()
rnf = CInt -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CUInt where rnf :: CUInt -> ()
rnf = CUInt -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CLong where rnf :: CLong -> ()
rnf = CLong -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CULong where rnf :: CULong -> ()
rnf = CULong -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CPtrdiff where rnf :: CPtrdiff -> ()
rnf = CPtrdiff -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CSize where rnf :: CSize -> ()
rnf = CSize -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CWchar where rnf :: CWchar -> ()
rnf = CWchar -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CSigAtomic where rnf :: CSigAtomic -> ()
rnf = CSigAtomic -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CLLong where rnf :: CLLong -> ()
rnf = CLLong -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CULLong where rnf :: CULLong -> ()
rnf = CULLong -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CIntPtr where rnf :: CIntPtr -> ()
rnf = CIntPtr -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CUIntPtr where rnf :: CUIntPtr -> ()
rnf = CUIntPtr -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CIntMax where rnf :: CIntMax -> ()
rnf = CIntMax -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CUIntMax where rnf :: CUIntMax -> ()
rnf = CUIntMax -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CClock where rnf :: CClock -> ()
rnf = CClock -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CTime where rnf :: CTime -> ()
rnf = CTime -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CUSeconds where rnf :: CUSeconds -> ()
rnf = CUSeconds -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CSUSeconds where rnf :: CSUSeconds -> ()
rnf = CSUSeconds -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CFloat where rnf :: CFloat -> ()
rnf = CFloat -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CDouble where rnf :: CDouble -> ()
rnf = CDouble -> ()
forall a. a -> ()
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
instance NFData CFile where rnf :: CFile -> ()
rnf = CFile -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CFpos where rnf :: CFpos -> ()
rnf = CFpos -> ()
forall a. a -> ()
rwhnf

-- |@since 1.4.0.0
instance NFData CJmpBuf where rnf :: CJmpBuf -> ()
rnf = CJmpBuf -> ()
forall a. a -> ()
rwhnf

#if MIN_VERSION_base(4,10,0)
-- | @since 1.4.3.0
instance NFData CBool where rnf :: CBool -> ()
rnf = CBool -> ()
forall a. a -> ()
rwhnf
#endif

----------------------------------------------------------------------------
-- System.Exit

-- |@since 1.4.2.0
instance NFData ExitCode where
  rnf :: ExitCode -> ()
rnf (ExitFailure Int
n) = Int -> ()
forall a. NFData a => a -> ()
rnf Int
n
  rnf ExitCode
ExitSuccess     = ()

----------------------------------------------------------------------------
-- instances previously provided by semigroups package

-- |@since 1.4.2.0
instance NFData a => NFData (NonEmpty a) where rnf :: NonEmpty a -> ()
rnf = NonEmpty a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 NonEmpty where
  liftRnf :: (a -> ()) -> NonEmpty a -> ()
liftRnf a -> ()
r (a
x :| [a]
xs) = a -> ()
r a
x () -> () -> ()
`seq` (a -> ()) -> [a] -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r [a]
xs

-- |@since 1.4.2.0
instance NFData a => NFData (Min a) where rnf :: Min a -> ()
rnf = Min a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Min where
  liftRnf :: (a -> ()) -> Min a -> ()
liftRnf a -> ()
r (Min a
a) = a -> ()
r a
a

-- |@since 1.4.2.0
instance NFData a => NFData (Max a) where rnf :: Max a -> ()
rnf = Max a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Max where
  liftRnf :: (a -> ()) -> Max a -> ()
liftRnf a -> ()
r (Max a
a) = a -> ()
r a
a

-- |@since 1.4.2.0
instance (NFData a, NFData b) => NFData (Arg a b) where rnf :: Arg a b -> ()
rnf = Arg a b -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
rnf2
-- |@since 1.4.3.0
instance (NFData a) => NFData1 (Arg a) where liftRnf :: (a -> ()) -> Arg a a -> ()
liftRnf = (a -> ()) -> (a -> ()) -> Arg a a -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a -> ()
forall a. NFData a => a -> ()
rnf
-- |@since 1.4.3.0
instance NFData2 Arg where
  liftRnf2 :: (a -> ()) -> (b -> ()) -> Arg a b -> ()
liftRnf2 a -> ()
r b -> ()
r' (Arg a
a b
b) = a -> ()
r a
a () -> () -> ()
`seq` b -> ()
r' b
b () -> () -> ()
`seq` ()

-- |@since 1.4.2.0
instance NFData a => NFData (Semi.First a) where rnf :: First a -> ()
rnf = First a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Semi.First where
  liftRnf :: (a -> ()) -> First a -> ()
liftRnf a -> ()
r (Semi.First a
a) = a -> ()
r a
a

-- |@since 1.4.2.0
instance NFData a => NFData (Semi.Last a) where rnf :: Last a -> ()
rnf = Last a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Semi.Last where
  liftRnf :: (a -> ()) -> Last a -> ()
liftRnf a -> ()
r (Semi.Last a
a) = a -> ()
r a
a

-- |@since 1.4.2.0
instance NFData m => NFData (WrappedMonoid m) where rnf :: WrappedMonoid m -> ()
rnf = WrappedMonoid m -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 WrappedMonoid where
  liftRnf :: (a -> ()) -> WrappedMonoid a -> ()
liftRnf a -> ()
r (WrapMonoid a
a) = a -> ()
r a
a

#if __GLASGOW_HASKELL__ < 901
-- |@since 1.4.2.0
instance NFData a => NFData (Option a) where rnf :: Option a -> ()
rnf = Option a -> ()
forall (f :: * -> *) a. (NFData1 f, NFData a) => f a -> ()
rnf1
-- |@since 1.4.3.0
instance NFData1 Option where
  liftRnf :: (a -> ()) -> Option a -> ()
liftRnf a -> ()
r (Option Maybe a
a) = (a -> ()) -> Maybe a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
r Maybe a
a
#endif

----------------------------------------------------------------------------
-- GHC.Stack

-- |@since 1.4.2.0
instance NFData SrcLoc where
  rnf :: SrcLoc -> ()
rnf (SrcLoc String
a String
b String
c Int
d Int
e Int
f Int
g) = String -> ()
forall a. NFData a => a -> ()
rnf String
a () -> () -> ()
`seq` String -> ()
forall a. NFData a => a -> ()
rnf String
b () -> () -> ()
`seq` String -> ()
forall a. NFData a => a -> ()
rnf String
c () -> () -> ()
`seq`
                               Int -> ()
forall a. NFData a => a -> ()
rnf Int
d () -> () -> ()
`seq` Int -> ()
forall a. NFData a => a -> ()
rnf Int
e () -> () -> ()
`seq` Int -> ()
forall a. NFData a => a -> ()
rnf Int
f () -> () -> ()
`seq` Int -> ()
forall a. NFData a => a -> ()
rnf Int
g

-- |@since 1.4.2.0
instance NFData CallStack where
  rnf :: CallStack -> ()
rnf CallStack
EmptyCallStack = ()
  rnf (PushCallStack String
a SrcLoc
b CallStack
c) = String -> ()
forall a. NFData a => a -> ()
rnf String
a () -> () -> ()
`seq` SrcLoc -> ()
forall a. NFData a => a -> ()
rnf SrcLoc
b () -> () -> ()
`seq` CallStack -> ()
forall a. NFData a => a -> ()
rnf CallStack
c
  rnf (FreezeCallStack CallStack
a)   = CallStack -> ()
forall a. NFData a => a -> ()
rnf CallStack
a

----------------------------------------------------------------------------
-- Tuples

#ifdef MIN_VERSION_ghc_prim
#if MIN_VERSION_ghc_prim(0,7,0)
-- |@since 1.4.6.0
instance NFData a => NFData (Solo a) where
  rnf (Solo a) = rnf a
-- |@since 1.4.6.0
instance NFData1 Solo where
  liftRnf r (Solo a) = r a
#endif
#endif

instance (NFData a, NFData b) => NFData (a,b) where rnf :: (a, b) -> ()
rnf = (a, b) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
rnf2
-- |@since 1.4.3.0
instance (NFData a) => NFData1 ((,) a) where liftRnf :: (a -> ()) -> (a, a) -> ()
liftRnf = (a -> ()) -> (a -> ()) -> (a, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a -> ()
forall a. NFData a => a -> ()
rnf
-- |@since 1.4.3.0
instance NFData2 (,) where
  liftRnf2 :: (a -> ()) -> (b -> ()) -> (a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a
x,b
y) = a -> ()
r a
x () -> () -> ()
`seq` b -> ()
r' b
y

-- Code below is generated, see generate-nfdata-tuple.hs
instance (NFData a1, NFData a2, NFData a3) =>
         NFData (a1, a2, a3) where rnf :: (a1, a2, a3) -> ()
rnf = (a1, a2, a3) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
rnf2
-- |@since 1.4.3.0
instance (NFData a1, NFData a2) =>
         NFData1 ((,,) a1 a2) where liftRnf :: (a -> ()) -> (a1, a2, a) -> ()
liftRnf = (a2 -> ()) -> (a -> ()) -> (a1, a2, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a2 -> ()
forall a. NFData a => a -> ()
rnf
-- |@since 1.4.3.0
instance (NFData a1) =>
         NFData2 ((,,) a1) where
  liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a1
x1,a
x2,b
x3) = a1 -> ()
forall a. NFData a => a -> ()
rnf a1
x1 () -> () -> ()
`seq` a -> ()
r a
x2 () -> () -> ()
`seq` b -> ()
r' b
x3

instance (NFData a1, NFData a2, NFData a3, NFData a4) =>
         NFData (a1, a2, a3, a4) where rnf :: (a1, a2, a3, a4) -> ()
rnf = (a1, a2, a3, a4) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
rnf2
-- |@since 1.4.3.0
instance (NFData a1, NFData a2, NFData a3) =>
         NFData1 ((,,,) a1 a2 a3) where liftRnf :: (a -> ()) -> (a1, a2, a3, a) -> ()
liftRnf = (a3 -> ()) -> (a -> ()) -> (a1, a2, a3, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a3 -> ()
forall a. NFData a => a -> ()
rnf
-- |@since 1.4.3.0
instance (NFData a1, NFData a2) =>
         NFData2 ((,,,) a1 a2) where
  liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a1
x1,a2
x2,a
x3,b
x4) = a1 -> ()
forall a. NFData a => a -> ()
rnf a1
x1 () -> () -> ()
`seq` a2 -> ()
forall a. NFData a => a -> ()
rnf a2
x2 () -> () -> ()
`seq` a -> ()
r a
x3 () -> () -> ()
`seq` b -> ()
r' b
x4

instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>
         NFData (a1, a2, a3, a4, a5) where rnf :: (a1, a2, a3, a4, a5) -> ()
rnf = (a1, a2, a3, a4, a5) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
rnf2
-- |@since 1.4.3.0
instance (NFData a1, NFData a2, NFData a3, NFData a4) =>
         NFData1 ((,,,,) a1 a2 a3 a4) where liftRnf :: (a -> ()) -> (a1, a2, a3, a4, a) -> ()
liftRnf = (a4 -> ()) -> (a -> ()) -> (a1, a2, a3, a4, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a4 -> ()
forall a. NFData a => a -> ()
rnf
-- |@since 1.4.3.0
instance (NFData a1, NFData a2, NFData a3) =>
         NFData2 ((,,,,) a1 a2 a3) where
  liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a1
x1,a2
x2,a3
x3,a
x4,b
x5) = a1 -> ()
forall a. NFData a => a -> ()
rnf a1
x1 () -> () -> ()
`seq` a2 -> ()
forall a. NFData a => a -> ()
rnf a2
x2 () -> () -> ()
`seq` a3 -> ()
forall a. NFData a => a -> ()
rnf a3
x3 () -> () -> ()
`seq` a -> ()
r a
x4 () -> () -> ()
`seq` b -> ()
r' b
x5

instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) =>
         NFData (a1, a2, a3, a4, a5, a6) where rnf :: (a1, a2, a3, a4, a5, a6) -> ()
rnf = (a1, a2, a3, a4, a5, a6) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
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 :: (a -> ()) -> (a1, a2, a3, a4, a5, a) -> ()
liftRnf = (a5 -> ()) -> (a -> ()) -> (a1, a2, a3, a4, a5, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a5 -> ()
forall a. NFData a => a -> ()
rnf
-- |@since 1.4.3.0
instance (NFData a1, NFData a2, NFData a3, NFData a4) =>
         NFData2 ((,,,,,) a1 a2 a3 a4) where
  liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a1
x1,a2
x2,a3
x3,a4
x4,a
x5,b
x6) = a1 -> ()
forall a. NFData a => a -> ()
rnf a1
x1 () -> () -> ()
`seq` a2 -> ()
forall a. NFData a => a -> ()
rnf a2
x2 () -> () -> ()
`seq` a3 -> ()
forall a. NFData a => a -> ()
rnf a3
x3 () -> () -> ()
`seq` a4 -> ()
forall a. NFData a => a -> ()
rnf a4
x4 () -> () -> ()
`seq` a -> ()
r a
x5 () -> () -> ()
`seq` b -> ()
r' b
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 :: (a1, a2, a3, a4, a5, a6, a7) -> ()
rnf = (a1, a2, a3, a4, a5, a6, a7) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
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 :: (a -> ()) -> (a1, a2, a3, a4, a5, a6, a) -> ()
liftRnf = (a6 -> ()) -> (a -> ()) -> (a1, a2, a3, a4, a5, a6, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a6 -> ()
forall a. NFData a => a -> ()
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 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a1
x1,a2
x2,a3
x3,a4
x4,a5
x5,a
x6,b
x7) = a1 -> ()
forall a. NFData a => a -> ()
rnf a1
x1 () -> () -> ()
`seq` a2 -> ()
forall a. NFData a => a -> ()
rnf a2
x2 () -> () -> ()
`seq` a3 -> ()
forall a. NFData a => a -> ()
rnf a3
x3 () -> () -> ()
`seq` a4 -> ()
forall a. NFData a => a -> ()
rnf a4
x4 () -> () -> ()
`seq` a5 -> ()
forall a. NFData a => a -> ()
rnf a5
x5 () -> () -> ()
`seq` a -> ()
r a
x6 () -> () -> ()
`seq` b -> ()
r' b
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 :: (a1, a2, a3, a4, a5, a6, a7, a8) -> ()
rnf = (a1, a2, a3, a4, a5, a6, a7, a8) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
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 :: (a -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a) -> ()
liftRnf = (a7 -> ()) -> (a -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a7 -> ()
forall a. NFData a => a -> ()
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 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a6, a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a1
x1,a2
x2,a3
x3,a4
x4,a5
x5,a6
x6,a
x7,b
x8) = a1 -> ()
forall a. NFData a => a -> ()
rnf a1
x1 () -> () -> ()
`seq` a2 -> ()
forall a. NFData a => a -> ()
rnf a2
x2 () -> () -> ()
`seq` a3 -> ()
forall a. NFData a => a -> ()
rnf a3
x3 () -> () -> ()
`seq` a4 -> ()
forall a. NFData a => a -> ()
rnf a4
x4 () -> () -> ()
`seq` a5 -> ()
forall a. NFData a => a -> ()
rnf a5
x5 () -> () -> ()
`seq` a6 -> ()
forall a. NFData a => a -> ()
rnf a6
x6 () -> () -> ()
`seq` a -> ()
r a
x7 () -> () -> ()
`seq` b -> ()
r' b
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 :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ()
rnf = (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ()
forall (p :: * -> * -> *) a b.
(NFData2 p, NFData a, NFData b) =>
p a b -> ()
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 :: (a -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a8, a) -> ()
liftRnf = (a8 -> ())
-> (a -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a8, a) -> ()
forall (p :: * -> * -> *) a b.
NFData2 p =>
(a -> ()) -> (b -> ()) -> p a b -> ()
liftRnf2 a8 -> ()
forall a. NFData a => a -> ()
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 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a, b) -> ()
liftRnf2 a -> ()
r b -> ()
r' (a1
x1,a2
x2,a3
x3,a4
x4,a5
x5,a6
x6,a7
x7,a
x8,b
x9) = a1 -> ()
forall a. NFData a => a -> ()
rnf a1
x1 () -> () -> ()
`seq` a2 -> ()
forall a. NFData a => a -> ()
rnf a2
x2 () -> () -> ()
`seq` a3 -> ()
forall a. NFData a => a -> ()
rnf a3
x3 () -> () -> ()
`seq` a4 -> ()
forall a. NFData a => a -> ()
rnf a4
x4 () -> () -> ()
`seq` a5 -> ()
forall a. NFData a => a -> ()
rnf a5
x5 () -> () -> ()
`seq` a6 -> ()
forall a. NFData a => a -> ()
rnf a6
x6 () -> () -> ()
`seq` a7 -> ()
forall a. NFData a => a -> ()
rnf a7
x7 () -> () -> ()
`seq` a -> ()
r a
x8 () -> () -> ()
`seq` b -> ()
r' b
x9

----------------------------------------------------------------------------
-- ByteArray

#if BYTEARRAY_IN_BASE
-- |@since 1.4.6.0
instance NFData ByteArray where
  rnf (ByteArray _) = ()
#endif