{-# LANGUAGE BangPatterns, TypeOperators, FlexibleContexts #-}
module Control.DeepSeq.Generics
( genericRnf
, genericRnfV1
) where
import Control.DeepSeq
import GHC.Generics
genericRnf :: (Generic a, GNFData (Rep a)) => a -> ()
genericRnf :: a -> ()
genericRnf = Rep a Any -> ()
forall (f :: * -> *) a. GNFData f => f a -> ()
grnf_ (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
{-# INLINE genericRnf #-}
class GNFData f where
grnf_ :: f a -> ()
instance GNFData U1 where
grnf_ :: U1 a -> ()
grnf_ U1 a
U1 = ()
instance NFData a => GNFData (K1 i a) where
grnf_ :: K1 i a a -> ()
grnf_ = 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 a => GNFData (M1 i c a) where
grnf_ :: M1 i c a a -> ()
grnf_ = a a -> ()
forall (f :: * -> *) a. GNFData f => f a -> ()
grnf_ (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 a, GNFData b) => GNFData (a :*: b) where
grnf_ :: (:*:) a b a -> ()
grnf_ (a a
x :*: b a
y) = a a -> ()
forall (f :: * -> *) a. GNFData f => f a -> ()
grnf_ a a
x () -> () -> ()
`seq` b a -> ()
forall (f :: * -> *) a. GNFData f => f a -> ()
grnf_ b a
y
{-# INLINEABLE grnf_ #-}
instance (GNFData a, GNFData b) => GNFData (a :+: b) where
grnf_ :: (:+:) a b a -> ()
grnf_ (L1 a a
x) = a a -> ()
forall (f :: * -> *) a. GNFData f => f a -> ()
grnf_ a a
x
grnf_ (R1 b a
x) = b a -> ()
forall (f :: * -> *) a. GNFData f => f a -> ()
grnf_ b a
x
{-# INLINEABLE grnf_ #-}
genericRnfV1 :: (Generic a, GNFDataV1 (Rep a)) => a -> ()
genericRnfV1 :: a -> ()
genericRnfV1 = Rep a Any -> ()
forall (f :: * -> *) a. GNFDataV1 f => f a -> ()
grnfV1_ (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
{-# INLINE genericRnfV1 #-}
class GNFDataV1 f where
grnfV1_ :: f a -> ()
instance GNFDataV1 V1 where
grnfV1_ :: V1 a -> ()
grnfV1_ = [Char] -> V1 a -> ()
forall a. HasCallStack => [Char] -> a
error [Char]
"Control.DeepSeq.Generics.genericRnfV1: uninhabited type"
instance GNFDataV1 U1 where
grnfV1_ :: U1 a -> ()
grnfV1_ U1 a
U1 = ()
instance NFData a => GNFDataV1 (K1 i a) where
grnfV1_ :: K1 i a a -> ()
grnfV1_ = 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 grnfV1_ #-}
instance GNFDataV1 a => GNFDataV1 (M1 i c a) where
grnfV1_ :: M1 i c a a -> ()
grnfV1_ = a a -> ()
forall (f :: * -> *) a. GNFDataV1 f => f a -> ()
grnfV1_ (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 grnfV1_ #-}
instance (GNFDataV1 a, GNFDataV1 b) => GNFDataV1 (a :*: b) where
grnfV1_ :: (:*:) a b a -> ()
grnfV1_ (a a
x :*: b a
y) = a a -> ()
forall (f :: * -> *) a. GNFDataV1 f => f a -> ()
grnfV1_ a a
x () -> () -> ()
`seq` b a -> ()
forall (f :: * -> *) a. GNFDataV1 f => f a -> ()
grnfV1_ b a
y
{-# INLINEABLE grnfV1_ #-}
instance (GNFDataV1 a, GNFDataV1 b) => GNFDataV1 (a :+: b) where
grnfV1_ :: (:+:) a b a -> ()
grnfV1_ (L1 a a
x) = a a -> ()
forall (f :: * -> *) a. GNFDataV1 f => f a -> ()
grnfV1_ a a
x
grnfV1_ (R1 b a
x) = b a -> ()
forall (f :: * -> *) a. GNFDataV1 f => f a -> ()
grnfV1_ b a
x
{-# INLINEABLE grnfV1_ #-}