packages feed

sdp-deepseq-0.2: src/Control/DeepSeq/SDP.hs

{-# 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 = o_foldr' deepseq ()
instance (NFData e) => NFData (SBytes# e) where rnf = rwhnf

instance (NFData i, NFData (rep e)) => NFData (AnyBorder rep i e)
  where
    rnf (AnyBorder l u rep) = l `deepseq` u `deepseq` rnf rep

instance (NFData (rep e)) => NFData (AnyChunks rep e)
  where
    rnf = foldr' deepseq () . toChunks

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

{- NFData1 and NFData2 instances. -}

instance NFData1 SArray# where liftRnf rnf' = o_foldr' (seq . rnf') ()

instance (NFData i, NFData1 rep) => NFData1 (AnyBorder rep i)
  where
    liftRnf rnf' (AnyBorder l u rep) = l `deepseq` u `deepseq` liftRnf rnf' rep

instance (NFData1 rep) => NFData1 (AnyChunks rep)
  where
    liftRnf rnf' = foldr' (seq . liftRnf rnf') () . toChunks

instance (NFData1 rep) => NFData2 (AnyBorder rep)
  where
    liftRnf2 rnf' rnf'' (AnyBorder l u rep) = rnf' l `seq` rnf' u `seq` liftRnf rnf'' rep