Skip to content

Commit 502f389

Browse files
LightAndLighttreeowl
authored andcommitted
add more NFData instances
1 parent 669f1c9 commit 502f389

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

Data/HashMap/Internal.hs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ import Data.Word (Word)
146146
#if __GLASGOW_HASKELL__ >= 711
147147
import Data.Semigroup (Semigroup((<>)))
148148
#endif
149-
import Control.DeepSeq (NFData(rnf))
149+
import Control.DeepSeq (NFData(rnf), NFData2(liftRnf2), NFData1(liftRnf))
150150
import Control.Monad.ST (ST)
151151
import Data.Bits ((.&.), (.|.), complement, popCount, unsafeShiftL, unsafeShiftR)
152152
import Data.Data hiding (Typeable)
@@ -201,6 +201,12 @@ data Leaf k v = L !k v
201201
instance (NFData k, NFData v) => NFData (Leaf k v) where
202202
rnf (L k v) = rnf k `seq` rnf v
203203

204+
instance NFData k => NFData1 (Leaf k) where
205+
liftRnf rnf2 = liftRnf2 rnf rnf2
206+
207+
instance NFData2 Leaf where
208+
liftRnf2 rnf1 rnf2 (L k v) = rnf1 k `seq` rnf2 v
209+
204210
-- Invariant: The length of the 1st argument to 'Full' is
205211
-- 2^bitsPerSubkey
206212

@@ -223,6 +229,16 @@ instance (NFData k, NFData v) => NFData (HashMap k v) where
223229
rnf (Full ary) = rnf ary
224230
rnf (Collision _ ary) = rnf ary
225231

232+
instance NFData k => NFData1 (HashMap k) where
233+
liftRnf rnf2 = liftRnf2 rnf rnf2
234+
235+
instance NFData2 HashMap where
236+
liftRnf2 _ _ Empty = ()
237+
liftRnf2 rnf1 rnf2 (BitmapIndexed _ ary) = liftRnf (liftRnf2 rnf1 rnf2) ary
238+
liftRnf2 rnf1 rnf2 (Leaf _ l) = liftRnf2 rnf1 rnf2 l
239+
liftRnf2 rnf1 rnf2 (Full ary) = liftRnf (liftRnf2 rnf1 rnf2) ary
240+
liftRnf2 rnf1 rnf2 (Collision _ ary) = liftRnf (liftRnf2 rnf1 rnf2) ary
241+
226242
instance Functor (HashMap k) where
227243
fmap = map
228244

Data/HashMap/Internal/Array.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,19 @@ rnfArray ary0 = go ary0 n0 0
250250
-- relevant rnf is strict, or in case it actually isn't.
251251
{-# INLINE rnfArray #-}
252252

253+
instance NFData1 Array where
254+
liftRnf = liftRnfArray
255+
256+
liftRnfArray :: (a -> ()) -> Array a -> ()
257+
liftRnfArray rnf0 ary0 = go ary0 n0 0
258+
where
259+
n0 = length ary0
260+
go !ary !n !i
261+
| i >= n = ()
262+
| (# x #) <- index# ary i
263+
= rnf0 x `seq` go ary n (i+1)
264+
{-# INLINE liftRnfArray #-}
265+
253266
-- | Create a new mutable array of specified size, in the specified
254267
-- state thread, with each element containing the specified initial
255268
-- value.

Data/HashSet/Internal.hs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ module Data.HashSet.Internal
9292
, keysSet
9393
) where
9494

95-
import Control.DeepSeq (NFData(..))
95+
import Control.DeepSeq (NFData(..), NFData1(..), NFData2 (liftRnf2))
9696
import Data.Data hiding (Typeable)
9797
import Data.HashMap.Internal
9898
( HashMap, foldMapWithKey, foldlWithKey, foldrWithKey
@@ -138,6 +138,9 @@ instance (NFData a) => NFData (HashSet a) where
138138
rnf = rnf . asMap
139139
{-# INLINE rnf #-}
140140

141+
instance NFData1 HashSet where
142+
liftRnf rnf1 = liftRnf2 rnf1 rnf . asMap
143+
141144
-- | Note that, in the presence of hash collisions, equal @HashSet@s may
142145
-- behave differently, i.e. substitutivity may be violated:
143146
--

0 commit comments

Comments
 (0)