{-# LANGUAGE Safe, MagicHash, FlexibleInstances #-}

{- |
    Module      :  Control.DeepSeq.SDP
    Copyright   :  (c) Andrey Mulik 2019
    License     :  BSD-style
    Maintainer  :  work.a.mulik@gmail.com
    Portability :  portable
    
    @Control.DeepSeq.SDP@ contains 'NFData' instances for @sdp@ types.
-}
module Control.DeepSeq.SDP
(
  -- * Exports.
  module Control.DeepSeq
)
where

import Prelude ()
import SDP.SafePrelude

import SDP.Templates.AnyChunks
import SDP.Templates.AnyBorder
import SDP.Prim.SArray
import SDP.Prim.SBytes

import Control.DeepSeq

default ()

--------------------------------------------------------------------------------

{- NFData instances. -}

instance (NFData e) => NFData (SArray# e) where rnf :: SArray# e -> ()
rnf = (e -> () -> ()) -> () -> SArray# e -> ()
forall l e b. Linear l e => (e -> b -> b) -> b -> l -> b
o_foldr' e -> () -> ()
forall a b. NFData a => a -> b -> b
deepseq ()
instance (NFData e) => NFData (SBytes# e) where rnf :: SBytes# e -> ()
rnf = SBytes# e -> ()
forall a. a -> ()
rwhnf

instance (NFData i, NFData (rep e)) => NFData (AnyBorder rep i e)
  where
    rnf :: AnyBorder rep i e -> ()
rnf (AnyBorder i
l i
u rep e
rep) = i
l i -> i -> i
forall a b. NFData a => a -> b -> b
`deepseq` i
u i -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq` rep e -> ()
forall a. NFData a => a -> ()
rnf rep e
rep

instance (NFData (rep e)) => NFData (AnyChunks rep e)
  where
    rnf :: AnyChunks rep e -> ()
rnf = (rep e -> () -> ()) -> () -> [rep e] -> ()
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr' rep e -> () -> ()
forall a b. NFData a => a -> b -> b
deepseq () ([rep e] -> ())
-> (AnyChunks rep e -> [rep e]) -> AnyChunks rep e -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnyChunks rep e -> [rep e]
forall (rep :: * -> *) e. AnyChunks rep e -> [rep e]
toChunks

--------------------------------------------------------------------------------

{- NFData1 and NFData2 instances. -}

instance NFData1 SArray# where liftRnf :: (a -> ()) -> SArray# a -> ()
liftRnf a -> ()
rnf' = (a -> () -> ()) -> () -> SArray# a -> ()
forall l e b. Linear l e => (e -> b -> b) -> b -> l -> b
o_foldr' (() -> () -> ()
seq (() -> () -> ()) -> (a -> ()) -> a -> () -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> ()
rnf') ()

instance (NFData i, NFData1 rep) => NFData1 (AnyBorder rep i)
  where
    liftRnf :: (a -> ()) -> AnyBorder rep i a -> ()
liftRnf a -> ()
rnf' (AnyBorder i
l i
u rep a
rep) = i
l i -> i -> i
forall a b. NFData a => a -> b -> b
`deepseq` i
u i -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq` (a -> ()) -> rep a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
rnf' rep a
rep

instance (NFData1 rep) => NFData1 (AnyChunks rep)
  where
    liftRnf :: (a -> ()) -> AnyChunks rep a -> ()
liftRnf a -> ()
rnf' = (rep a -> () -> ()) -> () -> [rep a] -> ()
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr' (() -> () -> ()
seq (() -> () -> ()) -> (rep a -> ()) -> rep a -> () -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> ()) -> rep a -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
rnf') () ([rep a] -> ())
-> (AnyChunks rep a -> [rep a]) -> AnyChunks rep a -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnyChunks rep a -> [rep a]
forall (rep :: * -> *) e. AnyChunks rep e -> [rep e]
toChunks

instance (NFData1 rep) => NFData2 (AnyBorder rep)
  where
    liftRnf2 :: (a -> ()) -> (b -> ()) -> AnyBorder rep a b -> ()
liftRnf2 a -> ()
rnf' b -> ()
rnf'' (AnyBorder a
l a
u rep b
rep) = a -> ()
rnf' a
l () -> () -> ()
`seq` a -> ()
rnf' a
u () -> () -> ()
`seq` (b -> ()) -> rep b -> ()
forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf b -> ()
rnf'' rep b
rep