{-# LANGUAGE TypeApplications #-}

module Data.Record.Generic.NFData (
    grnf
  ) where

import Control.DeepSeq (NFData, rnf)
import Data.Record.Generic
import qualified Data.Record.Generic.Rep as Rep

-- | Generic rnf function
--
-- Typical usage:
--
-- > instance NFData T where
-- >   rnf = grnf
--
grnf :: (Generic a, Constraints a NFData) => a -> ()
grnf :: forall a. (Generic a, Constraints a NFData) => a -> ()
grnf =
    forall a. NFData a => a -> ()
rnf
  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Rep (K a) b -> [a]
Rep.collapse
  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (c :: * -> Constraint) (f :: * -> *) (g :: * -> *).
(Generic a, Constraints a c) =>
Proxy c -> (forall x. c x => f x -> g x) -> Rep f a -> Rep g a
Rep.cmap (forall {k} (t :: k). Proxy t
Proxy @NFData) (forall {k} a b (c :: k). (a -> b) -> I a -> K b c
mapIK forall a. NFData a => a -> ()
rnf)
  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Generic a => a -> Rep I a
from