    {-# LANGUAGE BangPatterns #-}
    {-# LANGUAGE CPP #-}
    {-# LANGUAGE DefaultSignatures #-}
    {-# LANGUAGE FlexibleContexts #-}
    {-# LANGUAGE FlexibleInstances #-}
    {-# LANGUAGE GADTs #-}
    {-# LANGUAGE MultiParamTypeClasses #-}
    {-# LANGUAGE Safe #-}
    {-# LANGUAGE TypeOperators #-}

    #if __GLASGOW_HASKELL__ >= 706
    {-# LANGUAGE PolyKinds #-}
    #endif

    #if __GLASGOW_HASKELL__ >= 708
    {-# LANGUAGE EmptyCase #-}
    #endif

    #if __GLASGOW_HASKELL__ >= 811 && __GLASGOW_HASKELL__ < 901
    -- For the Option instance (https://gitlab.haskell.org/ghc/ghc/issues/15028)
    {-# OPTIONS_GHC -Wno-deprecations #-}
    #endif

    -----------------------------------------------------------------------------
    -- |
    -- 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 )

    #if MIN_VERSION_base(4,6,0)
    import Data.Ord ( Down(Down) )
    #else
    import Control.DeepSeq.BackDoor ( Down(Down) )
    #endif

    #if MIN_VERSION_base(4,7,0)
    import Data.Proxy ( Proxy(Proxy) )
    #endif

    #if MIN_VERSION_base(4,10,0)
    import Data.Type.Equality ( (:~:), (:~~:) )
    #elif MIN_VERSION_base(4,9,0)
    import Data.Type.Equality ( (:~:) )
    #elif MIN_VERSION_base(4,7,0)
    import Control.DeepSeq.BackDoor ( (:~:) )
    #endif

    #if MIN_VERSION_base(4,8,0)
    import Data.Functor.Identity ( Identity(..) )
    import Data.Typeable ( rnfTypeRep, rnfTyCon )
    import Data.Void ( Void, absurd )
    import Numeric.Natural ( Natural )
    #else
    import Data.Typeable ( typeRepTyCon, typeRepArgs, tyConPackage, tyConModule, tyConName )
    #endif

    #if MIN_VERSION_base(4,9,0)
    import Data.List.NonEmpty ( NonEmpty (..) )
    import Data.Semigroup as Semi
    #endif

    #if MIN_VERSION_base(4,9,0)
    import GHC.Stack.Types ( CallStack(..), SrcLoc(..) )
    import Data.Functor.Compose
    import qualified Data.Functor.Sum as Functor
    import qualified Data.Functor.Product as Functor
    #elif MIN_VERSION_base(4,8,1)
    import GHC.Stack ( CallStack(..) )
    import GHC.SrcLoc ( SrcLoc(..) )
    #endif

    import GHC.Fingerprint.Type ( Fingerprint(..) )
    import GHC.Generics

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

    instance GNFData arity V1 where
    #if __GLASGOW_HASKELL__ >= 708
      grnf :: forall a. RnfArgs arity a -> V1 a -> ()
    grnf RnfArgs arity a
    _ V1 a
    x = case V1 a
    x of {}
    #else
      grnf _ !_ = error "Control.DeepSeq.rnf: uninhabited type"
    #endif

    data Zero
    data One

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

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

    instance NFData a => GNFData arity (K1 i a) where
      grnf :: forall a. 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 k i c (p :: k). K1 i c p -> c
    unK1
      {-# INLINEABLE grnf #-}

    instance GNFData arity a => GNFData arity (M1 i c a) where
      grnf :: forall a. 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 k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
    unM1
      {-# INLINEABLE grnf #-}

    #if MIN_VERSION_base(4,9,0)
      -- | Because 'URec' did not exist prior to @base-4.9@, this instance is only
      -- defined on @base-4.9@ or later.
      --
      -- @since 1.4.5.0
    instance GNFData arity (URec a) where
      grnf :: forall a. 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 #-}
    #endif

    instance (GNFData arity a, GNFData arity b) => GNFData arity (a :*: b) where
      grnf :: forall a. 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 :: forall a. 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 :: forall a. 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 :: forall a. 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 :: forall a. 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 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1).
    (:.:) f g p -> f (g p)
    unComp1

    infixr 0 $!!

    -- | '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 :: forall a b. NFData a => 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 $!! :: forall a b. NFData a => (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 :: forall a. NFData a => 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 <$!!> :: forall (m :: * -> *) b a.
    (Monad m, NFData b) =>
    (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 :: forall a. 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 :: forall (f :: * -> *) a. (NFData1 f, NFData a) => 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 :: forall (p :: * -> * -> *) a b.
    (NFData2 p, NFData a, NFData b) =>
    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

    #if MIN_VERSION_base(4,7,0)
    -- |@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 :: forall a. (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 :: forall a. (a -> ()) -> (a :~: a) -> ()
    liftRnf a -> ()
    _ = (a :~: a) -> ()
    forall a. a -> ()
    rwhnf
    -- | @since 1.4.3.0
    instance NFData2 (:~:) where liftRnf2 :: forall a b. (a -> ()) -> (b -> ()) -> (a :~: b) -> ()
    liftRnf2 a -> ()
    _ b -> ()
    _ = (a :~: b) -> ()
    forall a. a -> ()
    rwhnf
    #endif

    #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 :: forall a. (a -> ()) -> (a :~~: a) -> ()
    liftRnf a -> ()
    _ = (a :~~: a) -> ()
    forall a. a -> ()
    rwhnf
    -- | @since 1.4.3.0
    instance NFData2 (:~~:) where liftRnf2 :: forall a b. (a -> ()) -> (b -> ()) -> (a :~~: b) -> ()
    liftRnf2 a -> ()
    _ b -> ()
    _ = (a :~~: b) -> ()
    forall a. a -> ()
    rwhnf
    #endif

    #if MIN_VERSION_base(4,8,0)
    -- |@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 :: forall a. (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
    #endif

    -- |@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 :: forall a. (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.

    #if MIN_VERSION_base(4,9,0)
    -- | Available on @base >=4.9@
    --
    -- @since 1.4.3.0
    instance NFData1 Ratio where
      liftRnf :: forall a. (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 :: forall a. (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} {k2} (f :: k1 -> *) (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 :: forall a. (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 :: forall a. (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
    #else
    instance (Integral a, NFData a) => NFData (Ratio a) where
    #endif
      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 :: forall a. (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 :: forall a. (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 :: forall a b. (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 :: forall a. (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 :: forall a. (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 {k} a (b :: k). Const a b -> a
    getConst
    -- |@since 1.4.3.0
    instance NFData a => NFData1 (Const a) where
        liftRnf :: forall a. (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 {k} a (b :: k). Const a b -> a
    getConst
    -- |@since 1.4.3.0
    instance NFData2 Const where
        liftRnf2 :: forall a b. (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 {k} a (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
    #if __GLASGOW_HASKELL__ >= 711
    instance (NFData a, NFData b) => NFData (Array a b) where
    #else
    instance (Ix a, NFData a, NFData b) => NFData (Array a b) where
    #endif
        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)

    #if __GLASGOW_HASKELL__ >= 711
    -- |@since 1.4.3.0
    instance (NFData a) => NFData1 (Array a) where
    #else
    -- |@since 1.4.3.0
    instance (Ix a, NFData a) => NFData1 (Array a) where
    #endif
        liftRnf :: forall a. (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)

    #if __GLASGOW_HASKELL__ >= 711
    -- |@since 1.4.3.0
    instance NFData2 Array where
        liftRnf2 :: forall a b. (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)
    #endif

    -- |@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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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`

    #if MIN_VERSION_base(4,8,0)
    -- | __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
    #else
    -- | __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 tr = rnf (typeRepTyCon tr) `seq` rnf (typeRepArgs tr)

    -- | __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 tc = rnf (tyConPackage tc) `seq`
                 rnf (tyConModule  tc) `seq`
                 rnf (tyConName    tc)
    #endif

    -- | __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 :: forall a. (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 :: forall a. (a -> ()) -> STRef s a -> ()
    liftRnf a -> ()
    _ = STRef s a -> ()
    forall a. a -> ()
    rwhnf
    -- |@since 1.4.3.0
    instance NFData2 STRef where
        liftRnf2 :: forall a b. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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

    #if MIN_VERSION_base(4,9,0)
    -- |@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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a b. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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 = rnf1
    -- |@since 1.4.3.0
    instance NFData1 Option where
      liftRnf r (Option a) = liftRnf r a
    #endif
    #endif

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

    #if MIN_VERSION_base(4,9,0)
    -- |@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

    #elif MIN_VERSION_base(4,8,1)
    -- |@since 1.4.2.0
    instance NFData SrcLoc where
      -- base-4.8 didn't expose the 'SrcLoc' constructor
      rnf sl = rnf (srcLocPackage   sl) `seq`
               rnf (srcLocModule    sl) `seq`
               rnf (srcLocFile      sl) `seq`
               rnf (srcLocStartLine sl) `seq`
               rnf (srcLocStartCol  sl) `seq`
               rnf (srcLocEndLine   sl) `seq`
               rnf (srcLocEndCol    sl)

    -- |@since 1.4.2.0
    instance NFData CallStack where
      rnf = rnf . getCallStack
    #endif

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

    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 :: forall a. (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 :: forall a b. (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 :: forall a. (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 :: forall a b. (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 :: forall a. (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 :: forall a b. (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 :: forall a. (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 :: forall a b. (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 :: forall a. (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 :: forall a b. (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 :: forall a. (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 :: forall a b.
    (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 :: forall a. (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 :: forall a b.
    (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 :: forall a. (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 :: forall a b.
    (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