{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE UnboxedTuples #-}
{-# OPTIONS_HADDOCK not-home #-}
module Data.HashMap.Internal.Strict
(
HashMap
, HM.empty
, singleton
, HM.null
, HM.size
, HM.member
, HM.lookup
, (HM.!?)
, HM.findWithDefault
, HM.lookupDefault
, (HM.!)
, HM.lookupKey
, insert
, insertWith
, HM.delete
, adjust
, update
, alter
, alterF
, HM.isSubmapOf
, HM.isSubmapOfBy
, HM.union
, unionWith
, unionWithKey
, HM.unions
, HM.compose
, map
, mapWithKey
, traverseWithKey
, HM.mapKeys
, HM.difference
, differenceWith
, differenceWithKey
, HM.intersection
, intersectionWith
, intersectionWithKey
, HM.disjoint
, HM.foldMapWithKey
, HM.foldr'
, HM.foldl'
, HM.foldrWithKey'
, HM.foldlWithKey'
, HM.foldr
, HM.foldl
, HM.foldrWithKey
, HM.foldlWithKey
, HM.filter
, HM.filterWithKey
, mapMaybe
, mapMaybeWithKey
, HM.keys
, HM.elems
, HM.toList
, fromList
, fromListWith
, fromListWithKey
) where
import Control.Applicative (Const (..))
import Control.Monad.ST (ST, runST)
import Data.Bits ((.&.), (.|.))
import Data.Coerce (coerce)
import Data.Functor.Identity (Identity (..))
import Data.Hashable (Hashable)
import Data.HashMap.Internal (Hash, HashMap (..), Leaf (..), LookupRes (..),
Shift, fullBitmap, hash, index, mask, nextShift,
ptrEq, sparseIndex)
import Prelude hiding (lookup, map)
import qualified Data.HashMap.Internal as HM
import qualified Data.HashMap.Internal.Array as A
import qualified Data.List as List
import qualified GHC.Exts as Exts
singleton :: (Hashable k) => k -> v -> HashMap k v
singleton :: forall k v. Hashable k => k -> v -> HashMap k v
singleton k
k !v
v = k -> v -> HashMap k v
forall k v. Hashable k => k -> v -> HashMap k v
HM.singleton k
k v
v
insert :: Hashable k => k -> v -> HashMap k v -> HashMap k v
insert :: forall k v. Hashable k => k -> v -> HashMap k v -> HashMap k v
insert k
k !v
v = k -> v -> HashMap k v -> HashMap k v
forall k v. Hashable k => k -> v -> HashMap k v -> HashMap k v
HM.insert k
k v
v
{-# INLINABLE insert #-}
insertWith :: Hashable k => (v -> v -> v) -> k -> v -> HashMap k v
-> HashMap k v
insertWith :: forall k v.
Hashable k =>
(v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
insertWith v -> v -> v
f k
k0 v
v0 HashMap k v
m0 = Word -> k -> v -> Int -> HashMap k v -> HashMap k v
forall {a}.
Eq a =>
Word -> a -> v -> Int -> HashMap a v -> HashMap a v
go Word
h0 k
k0 v
v0 Int
0 HashMap k v
m0
where
h0 :: Word
h0 = k -> Word
forall a. Hashable a => a -> Word
hash k
k0
go :: Word -> a -> v -> Int -> HashMap a v -> HashMap a v
go !Word
h !a
k v
x !Int
_ HashMap a v
Empty = Word -> a -> v -> HashMap a v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h a
k v
x
go Word
h a
k v
x Int
s t :: HashMap a v
t@(Leaf Word
hy l :: Leaf a v
l@(L a
ky v
y))
| Word
hy Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
h = if a
ky a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
k
then Word -> a -> v -> HashMap a v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h a
k (v -> v -> v
f v
x v
y)
else v
x v -> HashMap a v -> HashMap a v
forall a b. a -> b -> b
`seq` Word -> Leaf a v -> Leaf a v -> HashMap a v
forall k v. Word -> Leaf k v -> Leaf k v -> HashMap k v
HM.collision Word
h Leaf a v
l (a -> v -> Leaf a v
forall k v. k -> v -> Leaf k v
L a
k v
x)
| Bool
otherwise = v
x v -> HashMap a v -> HashMap a v
forall a b. a -> b -> b
`seq` (forall s. ST s (HashMap a v)) -> HashMap a v
forall a. (forall s. ST s a) -> a
runST (Int -> Word -> a -> v -> Word -> HashMap a v -> ST s (HashMap a v)
forall k v s.
Int -> Word -> k -> v -> Word -> HashMap k v -> ST s (HashMap k v)
HM.two Int
s Word
h a
k v
x Word
hy HashMap a v
t)
go Word
h a
k v
x Int
s (BitmapIndexed Word
b Array (HashMap a v)
ary)
| Word
b Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
m Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 =
let ary' :: Array (HashMap a v)
ary' = Array (HashMap a v) -> Int -> HashMap a v -> Array (HashMap a v)
forall e. Array e -> Int -> e -> Array e
A.insert Array (HashMap a v)
ary Int
i (HashMap a v -> Array (HashMap a v))
-> HashMap a v -> Array (HashMap a v)
forall a b. (a -> b) -> a -> b
$! Word -> a -> v -> HashMap a v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h a
k v
x
in Word -> Array (HashMap a v) -> HashMap a v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
HM.bitmapIndexedOrFull (Word
b Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word
m) Array (HashMap a v)
ary'
| Bool
otherwise =
case Array (HashMap a v) -> Int -> (# HashMap a v #)
forall a. Array a -> Int -> (# a #)
A.index# Array (HashMap a v)
ary Int
i of
(# HashMap a v
st #) ->
let !st' :: HashMap a v
st' = Word -> a -> v -> Int -> HashMap a v -> HashMap a v
go Word
h a
k v
x (Int -> Int
nextShift Int
s) HashMap a v
st
ary' :: Array (HashMap a v)
ary' = Array (HashMap a v) -> Int -> HashMap a v -> Array (HashMap a v)
forall e. Array e -> Int -> e -> Array e
A.update Array (HashMap a v)
ary Int
i HashMap a v
st'
in Word -> Array (HashMap a v) -> HashMap a v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed Word
b Array (HashMap a v)
ary'
where m :: Word
m = Word -> Int -> Word
mask Word
h Int
s
i :: Int
i = Word -> Word -> Int
sparseIndex Word
b Word
m
go Word
h a
k v
x Int
s (Full Array (HashMap a v)
ary) =
case Array (HashMap a v) -> Int -> (# HashMap a v #)
forall a. Array a -> Int -> (# a #)
A.index# Array (HashMap a v)
ary Int
i of
(# HashMap a v
st #) ->
let !st' :: HashMap a v
st' = Word -> a -> v -> Int -> HashMap a v -> HashMap a v
go Word
h a
k v
x (Int -> Int
nextShift Int
s) HashMap a v
st
ary' :: Array (HashMap a v)
ary' = Array (HashMap a v) -> Int -> HashMap a v -> Array (HashMap a v)
forall e. Array e -> Int -> e -> Array e
HM.updateFullArray Array (HashMap a v)
ary Int
i HashMap a v
st'
in Array (HashMap a v) -> HashMap a v
forall k v. Array (HashMap k v) -> HashMap k v
Full Array (HashMap a v)
ary'
where i :: Int
i = Word -> Int -> Int
index Word
h Int
s
go Word
h a
k v
x Int
s t :: HashMap a v
t@(Collision Word
hy Array (Leaf a v)
v)
| Word
h Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
hy = Word -> Array (Leaf a v) -> HashMap a v
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h ((v -> v -> v) -> a -> v -> Array (Leaf a v) -> Array (Leaf a v)
forall k v.
Eq k =>
(v -> v -> v) -> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
updateOrSnocWith v -> v -> v
f a
k v
x Array (Leaf a v)
v)
| Bool
otherwise = Word -> a -> v -> Int -> HashMap a v -> HashMap a v
go Word
h a
k v
x Int
s (HashMap a v -> HashMap a v) -> HashMap a v -> HashMap a v
forall a b. (a -> b) -> a -> b
$ Word -> Array (HashMap a v) -> HashMap a v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed (Word -> Int -> Word
mask Word
hy Int
s) (HashMap a v -> Array (HashMap a v)
forall a. a -> Array a
A.singleton HashMap a v
t)
{-# INLINABLE insertWith #-}
unsafeInsertWith :: Hashable k => (v -> v -> v) -> k -> v -> HashMap k v
-> HashMap k v
unsafeInsertWith :: forall k v.
Hashable k =>
(v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
unsafeInsertWith v -> v -> v
f k
k0 v
v0 HashMap k v
m0 = (k -> v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
forall k v.
Hashable k =>
(k -> v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
unsafeInsertWithKey ((v -> v -> v) -> k -> v -> v -> v
forall a b. a -> b -> a
const v -> v -> v
f) k
k0 v
v0 HashMap k v
m0
{-# INLINABLE unsafeInsertWith #-}
unsafeInsertWithKey :: forall k v. Hashable k => (k -> v -> v -> v) -> k -> v -> HashMap k v
-> HashMap k v
unsafeInsertWithKey :: forall k v.
Hashable k =>
(k -> v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
unsafeInsertWithKey k -> v -> v -> v
f k
k0 v
v0 HashMap k v
m0 = (forall s. ST s (HashMap k v)) -> HashMap k v
forall a. (forall s. ST s a) -> a
runST (Word -> k -> v -> Int -> HashMap k v -> ST s (HashMap k v)
forall s.
Word -> k -> v -> Int -> HashMap k v -> ST s (HashMap k v)
go Word
h0 k
k0 v
v0 Int
0 HashMap k v
m0)
where
h0 :: Word
h0 = k -> Word
forall a. Hashable a => a -> Word
hash k
k0
go :: forall s. Hash -> k -> v -> Shift -> HashMap k v -> ST s (HashMap k v)
go :: forall s.
Word -> k -> v -> Int -> HashMap k v -> ST s (HashMap k v)
go !Word
h !k
k v
x !Int
_ HashMap k v
Empty = HashMap k v -> ST s (HashMap k v)
forall a. a -> ST s a
forall (m :: * -> *) a. Monad m => a -> m a
return (HashMap k v -> ST s (HashMap k v))
-> HashMap k v -> ST s (HashMap k v)
forall a b. (a -> b) -> a -> b
$! Word -> k -> v -> HashMap k v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k v
x
go Word
h k
k v
x Int
s t :: HashMap k v
t@(Leaf Word
hy l :: Leaf k v
l@(L k
ky v
y))
| Word
hy Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
h = if k
ky k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
k
then HashMap k v -> ST s (HashMap k v)
forall a. a -> ST s a
forall (m :: * -> *) a. Monad m => a -> m a
return (HashMap k v -> ST s (HashMap k v))
-> HashMap k v -> ST s (HashMap k v)
forall a b. (a -> b) -> a -> b
$! Word -> k -> v -> HashMap k v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k (k -> v -> v -> v
f k
k v
x v
y)
else do
let l' :: Leaf k v
l' = v
x v -> Leaf k v -> Leaf k v
forall a b. a -> b -> b
`seq` k -> v -> Leaf k v
forall k v. k -> v -> Leaf k v
L k
k v
x
HashMap k v -> ST s (HashMap k v)
forall a. a -> ST s a
forall (m :: * -> *) a. Monad m => a -> m a
return (HashMap k v -> ST s (HashMap k v))
-> HashMap k v -> ST s (HashMap k v)
forall a b. (a -> b) -> a -> b
$! Word -> Leaf k v -> Leaf k v -> HashMap k v
forall k v. Word -> Leaf k v -> Leaf k v -> HashMap k v
HM.collision Word
h Leaf k v
l Leaf k v
l'
| Bool
otherwise = v
x v -> ST s (HashMap k v) -> ST s (HashMap k v)
forall a b. a -> b -> b
`seq` Int -> Word -> k -> v -> Word -> HashMap k v -> ST s (HashMap k v)
forall k v s.
Int -> Word -> k -> v -> Word -> HashMap k v -> ST s (HashMap k v)
HM.two Int
s Word
h k
k v
x Word
hy HashMap k v
t
go Word
h k
k v
x Int
s t :: HashMap k v
t@(BitmapIndexed Word
b Array (HashMap k v)
ary)
| Word
b Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
m Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 = do
ary' <- Array (HashMap k v)
-> Int -> HashMap k v -> ST s (Array (HashMap k v))
forall e s. Array e -> Int -> e -> ST s (Array e)
A.insertM Array (HashMap k v)
ary Int
i (HashMap k v -> ST s (Array (HashMap k v)))
-> HashMap k v -> ST s (Array (HashMap k v))
forall a b. (a -> b) -> a -> b
$! Word -> k -> v -> HashMap k v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k v
x
return $! HM.bitmapIndexedOrFull (b .|. m) ary'
| Bool
otherwise = do
st <- Array (HashMap k v) -> Int -> ST s (HashMap k v)
forall a s. Array a -> Int -> ST s a
A.indexM Array (HashMap k v)
ary Int
i
st' <- go h k x (nextShift s) st
A.unsafeUpdateM ary i st'
return t
where m :: Word
m = Word -> Int -> Word
mask Word
h Int
s
i :: Int
i = Word -> Word -> Int
sparseIndex Word
b Word
m
go Word
h k
k v
x Int
s t :: HashMap k v
t@(Full Array (HashMap k v)
ary) = do
st <- Array (HashMap k v) -> Int -> ST s (HashMap k v)
forall a s. Array a -> Int -> ST s a
A.indexM Array (HashMap k v)
ary Int
i
st' <- go h k x (nextShift s) st
A.unsafeUpdateM ary i st'
return t
where i :: Int
i = Word -> Int -> Int
index Word
h Int
s
go Word
h k
k v
x Int
s t :: HashMap k v
t@(Collision Word
hy Array (Leaf k v)
v)
| Word
h Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
hy = HashMap k v -> ST s (HashMap k v)
forall a. a -> ST s a
forall (m :: * -> *) a. Monad m => a -> m a
return (HashMap k v -> ST s (HashMap k v))
-> HashMap k v -> ST s (HashMap k v)
forall a b. (a -> b) -> a -> b
$! Word -> Array (Leaf k v) -> HashMap k v
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h ((k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
forall k v.
Eq k =>
(k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
updateOrSnocWithKey k -> v -> v -> v
f k
k v
x Array (Leaf k v)
v)
| Bool
otherwise = Word -> k -> v -> Int -> HashMap k v -> ST s (HashMap k v)
forall s.
Word -> k -> v -> Int -> HashMap k v -> ST s (HashMap k v)
go Word
h k
k v
x Int
s (HashMap k v -> ST s (HashMap k v))
-> HashMap k v -> ST s (HashMap k v)
forall a b. (a -> b) -> a -> b
$ Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed (Word -> Int -> Word
mask Word
hy Int
s) (HashMap k v -> Array (HashMap k v)
forall a. a -> Array a
A.singleton HashMap k v
t)
{-# INLINABLE unsafeInsertWithKey #-}
adjust :: Hashable k => (v -> v) -> k -> HashMap k v -> HashMap k v
adjust :: forall k v.
Hashable k =>
(v -> v) -> k -> HashMap k v -> HashMap k v
adjust v -> v
f k
k0 HashMap k v
m0 = Word -> k -> Int -> HashMap k v -> HashMap k v
forall {k}. Eq k => Word -> k -> Int -> HashMap k v -> HashMap k v
go Word
h0 k
k0 Int
0 HashMap k v
m0
where
h0 :: Word
h0 = k -> Word
forall a. Hashable a => a -> Word
hash k
k0
go :: Word -> k -> Int -> HashMap k v -> HashMap k v
go !Word
_ !k
_ !Int
_ HashMap k v
Empty = HashMap k v
forall k v. HashMap k v
Empty
go Word
h k
k Int
_ t :: HashMap k v
t@(Leaf Word
hy (L k
ky v
y))
| Word
hy Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
h Bool -> Bool -> Bool
&& k
ky k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
k = Word -> k -> v -> HashMap k v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k (v -> v
f v
y)
| Bool
otherwise = HashMap k v
t
go Word
h k
k Int
s t :: HashMap k v
t@(BitmapIndexed Word
b Array (HashMap k v)
ary)
| Word
b Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
m Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 = HashMap k v
t
| Bool
otherwise =
case Array (HashMap k v) -> Int -> (# HashMap k v #)
forall a. Array a -> Int -> (# a #)
A.index# Array (HashMap k v)
ary Int
i of
(# HashMap k v
st #) ->
let !st' :: HashMap k v
st' = Word -> k -> Int -> HashMap k v -> HashMap k v
go Word
h k
k (Int -> Int
nextShift Int
s) HashMap k v
st
ary' :: Array (HashMap k v)
ary' = Array (HashMap k v) -> Int -> HashMap k v -> Array (HashMap k v)
forall e. Array e -> Int -> e -> Array e
A.update Array (HashMap k v)
ary Int
i HashMap k v
st'
in Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed Word
b Array (HashMap k v)
ary'
where m :: Word
m = Word -> Int -> Word
mask Word
h Int
s
i :: Int
i = Word -> Word -> Int
sparseIndex Word
b Word
m
go Word
h k
k Int
s (Full Array (HashMap k v)
ary) =
case Array (HashMap k v) -> Int -> (# HashMap k v #)
forall a. Array a -> Int -> (# a #)
A.index# Array (HashMap k v)
ary Int
i of
(# HashMap k v
st #) ->
let !st' :: HashMap k v
st' = Word -> k -> Int -> HashMap k v -> HashMap k v
go Word
h k
k (Int -> Int
nextShift Int
s) HashMap k v
st
ary' :: Array (HashMap k v)
ary' = Array (HashMap k v) -> Int -> HashMap k v -> Array (HashMap k v)
forall e. Array e -> Int -> e -> Array e
HM.updateFullArray Array (HashMap k v)
ary Int
i HashMap k v
st'
in Array (HashMap k v) -> HashMap k v
forall k v. Array (HashMap k v) -> HashMap k v
Full Array (HashMap k v)
ary'
where i :: Int
i = Word -> Int -> Int
index Word
h Int
s
go Word
h k
k Int
_ t :: HashMap k v
t@(Collision Word
hy Array (Leaf k v)
v)
| Word
h Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
hy = Word -> Array (Leaf k v) -> HashMap k v
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h ((v -> v) -> k -> Array (Leaf k v) -> Array (Leaf k v)
forall k v.
Eq k =>
(v -> v) -> k -> Array (Leaf k v) -> Array (Leaf k v)
updateWith v -> v
f k
k Array (Leaf k v)
v)
| Bool
otherwise = HashMap k v
t
{-# INLINABLE adjust #-}
update :: Hashable k => (a -> Maybe a) -> k -> HashMap k a -> HashMap k a
update :: forall k a.
Hashable k =>
(a -> Maybe a) -> k -> HashMap k a -> HashMap k a
update a -> Maybe a
f = (Maybe a -> Maybe a) -> k -> HashMap k a -> HashMap k a
forall k v.
Hashable k =>
(Maybe v -> Maybe v) -> k -> HashMap k v -> HashMap k v
alter (Maybe a -> (a -> Maybe a) -> Maybe a
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> Maybe a
f)
{-# INLINABLE update #-}
alter :: Hashable k => (Maybe v -> Maybe v) -> k -> HashMap k v -> HashMap k v
alter :: forall k v.
Hashable k =>
(Maybe v -> Maybe v) -> k -> HashMap k v -> HashMap k v
alter Maybe v -> Maybe v
f k
k HashMap k v
m =
let !h :: Word
h = k -> Word
forall a. Hashable a => a -> Word
hash k
k
!lookupRes :: LookupRes v
lookupRes = Word -> k -> HashMap k v -> LookupRes v
forall k v. Eq k => Word -> k -> HashMap k v -> LookupRes v
HM.lookupRecordCollision Word
h k
k HashMap k v
m
in case Maybe v -> Maybe v
f (LookupRes v -> Maybe v
forall a. LookupRes a -> Maybe a
HM.lookupResToMaybe LookupRes v
lookupRes) of
Maybe v
Nothing -> case LookupRes v
lookupRes of
LookupRes v
Absent -> HashMap k v
m
Present v
_ Int
collPos -> Int -> Word -> k -> HashMap k v -> HashMap k v
forall k v. Int -> Word -> k -> HashMap k v -> HashMap k v
HM.deleteKeyExists Int
collPos Word
h k
k HashMap k v
m
Just !v
v' -> case LookupRes v
lookupRes of
LookupRes v
Absent -> Word -> k -> v -> HashMap k v -> HashMap k v
forall k v. Word -> k -> v -> HashMap k v -> HashMap k v
HM.insertNewKey Word
h k
k v
v' HashMap k v
m
Present v
v Int
collPos ->
if v
v v -> v -> Bool
forall a. a -> a -> Bool
`ptrEq` v
v'
then HashMap k v
m
else Int -> Word -> k -> v -> HashMap k v -> HashMap k v
forall k v. Int -> Word -> k -> v -> HashMap k v -> HashMap k v
HM.insertKeyExists Int
collPos Word
h k
k v
v' HashMap k v
m
{-# INLINABLE alter #-}
alterF :: (Functor f, Hashable k)
=> (Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
alterF :: forall (f :: * -> *) k v.
(Functor f, Hashable k) =>
(Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
alterF Maybe v -> f (Maybe v)
f = \ !k
k !HashMap k v
m ->
let !h :: Word
h = k -> Word
forall a. Hashable a => a -> Word
hash k
k
mv :: Maybe v
mv = Word -> k -> HashMap k v -> Maybe v
forall k v. Eq k => Word -> k -> HashMap k v -> Maybe v
HM.lookup' Word
h k
k HashMap k v
m
in ((Maybe v -> HashMap k v) -> f (Maybe v) -> f (HashMap k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe v -> f (Maybe v)
f Maybe v
mv) ((Maybe v -> HashMap k v) -> f (HashMap k v))
-> (Maybe v -> HashMap k v) -> f (HashMap k v)
forall a b. (a -> b) -> a -> b
$ \case
Maybe v
Nothing -> HashMap k v -> (v -> HashMap k v) -> Maybe v -> HashMap k v
forall b a. b -> (a -> b) -> Maybe a -> b
maybe HashMap k v
m (HashMap k v -> v -> HashMap k v
forall a b. a -> b -> a
const (Word -> k -> HashMap k v -> HashMap k v
forall k v. Eq k => Word -> k -> HashMap k v -> HashMap k v
HM.delete' Word
h k
k HashMap k v
m)) Maybe v
mv
Just !v
v' -> Word -> k -> v -> HashMap k v -> HashMap k v
forall k v. Eq k => Word -> k -> v -> HashMap k v -> HashMap k v
HM.insert' Word
h k
k v
v' HashMap k v
m
{-# INLINABLE [0] alterF #-}
test_bottom :: a
test_bottom :: forall a. a
test_bottom = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"Data.HashMap.alterF internal error: hit test_bottom"
bogus# :: (# #) -> (# a #)
bogus# :: forall a. (# #) -> (# a #)
bogus# (# #)
_ = [Char] -> (# a #)
forall a. HasCallStack => [Char] -> a
error [Char]
"Data.HashMap.alterF internal error: hit bogus#"
impossibleAdjust :: a
impossibleAdjust :: forall a. a
impossibleAdjust = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"Data.HashMap.alterF internal error: impossible adjust"
{-# RULES
-- See detailed notes on alterF rules in Data.HashMap.Internal.
"alterFWeird" forall f. alterF f =
alterFWeird (f Nothing) (f (Just test_bottom)) f
"alterFconstant" forall (f :: Maybe a -> Identity (Maybe a)) x.
alterFWeird x x f = \ !k !m ->
Identity (case runIdentity x of {Nothing -> HM.delete k m; Just a -> insert k a m})
"alterFinsertWith" [1] forall (f :: Maybe a -> Identity (Maybe a)) x y.
alterFWeird (coerce (Just x)) (coerce (Just y)) f =
coerce (HM.insertModifying x (\mold -> case runIdentity (f (Just mold)) of
Nothing -> bogus# (# #)
Just !new -> (# new #)))
-- This rule is written a bit differently than the one for lazy
-- maps because the adjust here is strict. We could write it the
-- same general way anyway, but this seems simpler.
"alterFadjust" forall (f :: Maybe a -> Identity (Maybe a)) x.
alterFWeird (coerce Nothing) (coerce (Just x)) f =
coerce (adjust (\a -> case runIdentity (f (Just a)) of
Just a' -> a'
Nothing -> impossibleAdjust))
"alterFlookup" forall _ign1 _ign2 (f :: Maybe a -> Const r (Maybe a)) .
alterFWeird _ign1 _ign2 f = \ !k !m -> Const (getConst (f (HM.lookup k m)))
#-}
alterFWeird
:: (Functor f, Hashable k)
=> f (Maybe v)
-> f (Maybe v)
-> (Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
alterFWeird :: forall (f :: * -> *) k v.
(Functor f, Hashable k) =>
f (Maybe v)
-> f (Maybe v)
-> (Maybe v -> f (Maybe v))
-> k
-> HashMap k v
-> f (HashMap k v)
alterFWeird f (Maybe v)
_ f (Maybe v)
_ Maybe v -> f (Maybe v)
f = (Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
forall (f :: * -> *) k v.
(Functor f, Hashable k) =>
(Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
alterFEager Maybe v -> f (Maybe v)
f
{-# INLINE [0] alterFWeird #-}
alterFEager :: (Functor f, Hashable k)
=> (Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
alterFEager :: forall (f :: * -> *) k v.
(Functor f, Hashable k) =>
(Maybe v -> f (Maybe v)) -> k -> HashMap k v -> f (HashMap k v)
alterFEager Maybe v -> f (Maybe v)
f !k
k !HashMap k v
m = ((Maybe v -> HashMap k v) -> f (Maybe v) -> f (HashMap k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe v -> f (Maybe v)
f Maybe v
mv) ((Maybe v -> HashMap k v) -> f (HashMap k v))
-> (Maybe v -> HashMap k v) -> f (HashMap k v)
forall a b. (a -> b) -> a -> b
$ \Maybe v
fres ->
case Maybe v
fres of
Maybe v
Nothing -> case LookupRes v
lookupRes of
LookupRes v
Absent -> HashMap k v
m
Present v
_ Int
collPos -> Int -> Word -> k -> HashMap k v -> HashMap k v
forall k v. Int -> Word -> k -> HashMap k v -> HashMap k v
HM.deleteKeyExists Int
collPos Word
h k
k HashMap k v
m
Just !v
v' -> case LookupRes v
lookupRes of
LookupRes v
Absent -> Word -> k -> v -> HashMap k v -> HashMap k v
forall k v. Word -> k -> v -> HashMap k v -> HashMap k v
HM.insertNewKey Word
h k
k v
v' HashMap k v
m
Present v
v Int
collPos ->
if v
v v -> v -> Bool
forall a. a -> a -> Bool
`ptrEq` v
v'
then HashMap k v
m
else Int -> Word -> k -> v -> HashMap k v -> HashMap k v
forall k v. Int -> Word -> k -> v -> HashMap k v -> HashMap k v
HM.insertKeyExists Int
collPos Word
h k
k v
v' HashMap k v
m
where !h :: Word
h = k -> Word
forall a. Hashable a => a -> Word
hash k
k
!lookupRes :: LookupRes v
lookupRes = Word -> k -> HashMap k v -> LookupRes v
forall k v. Eq k => Word -> k -> HashMap k v -> LookupRes v
HM.lookupRecordCollision Word
h k
k HashMap k v
m
!mv :: Maybe v
mv = LookupRes v -> Maybe v
forall a. LookupRes a -> Maybe a
HM.lookupResToMaybe LookupRes v
lookupRes
{-# INLINABLE alterFEager #-}
unionWith :: Eq k => (v -> v -> v) -> HashMap k v -> HashMap k v
-> HashMap k v
unionWith :: forall k v.
Eq k =>
(v -> v -> v) -> HashMap k v -> HashMap k v -> HashMap k v
unionWith v -> v -> v
f = (k -> v -> v -> v) -> HashMap k v -> HashMap k v -> HashMap k v
forall k v.
Eq k =>
(k -> v -> v -> v) -> HashMap k v -> HashMap k v -> HashMap k v
unionWithKey ((v -> v -> v) -> k -> v -> v -> v
forall a b. a -> b -> a
const v -> v -> v
f)
{-# INLINE unionWith #-}
unionWithKey :: Eq k => (k -> v -> v -> v) -> HashMap k v -> HashMap k v
-> HashMap k v
unionWithKey :: forall k v.
Eq k =>
(k -> v -> v -> v) -> HashMap k v -> HashMap k v -> HashMap k v
unionWithKey k -> v -> v -> v
f = Int -> HashMap k v -> HashMap k v -> HashMap k v
go Int
0
where
go :: Int -> HashMap k v -> HashMap k v -> HashMap k v
go !Int
_ HashMap k v
t1 HashMap k v
Empty = HashMap k v
t1
go Int
_ HashMap k v
Empty HashMap k v
t2 = HashMap k v
t2
go Int
s t1 :: HashMap k v
t1@(Leaf Word
h1 l1 :: Leaf k v
l1@(L k
k1 v
v1)) t2 :: HashMap k v
t2@(Leaf Word
h2 l2 :: Leaf k v
l2@(L k
k2 v
v2))
| Word
h1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
h2 = if k
k1 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
k2
then Word -> k -> v -> HashMap k v
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h1 k
k1 (k -> v -> v -> v
f k
k1 v
v1 v
v2)
else Word -> Leaf k v -> Leaf k v -> HashMap k v
forall k v. Word -> Leaf k v -> Leaf k v -> HashMap k v
HM.collision Word
h1 Leaf k v
l1 Leaf k v
l2
| Bool
otherwise = Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
forall {k} {v}.
Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
goDifferentHash Int
s Word
h1 Word
h2 HashMap k v
t1 HashMap k v
t2
go Int
s t1 :: HashMap k v
t1@(Leaf Word
h1 (L k
k1 v
v1)) t2 :: HashMap k v
t2@(Collision Word
h2 Array (Leaf k v)
ls2)
| Word
h1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
h2 = Word -> Array (Leaf k v) -> HashMap k v
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h1 ((k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
forall k v.
Eq k =>
(k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
updateOrSnocWithKey k -> v -> v -> v
f k
k1 v
v1 Array (Leaf k v)
ls2)
| Bool
otherwise = Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
forall {k} {v}.
Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
goDifferentHash Int
s Word
h1 Word
h2 HashMap k v
t1 HashMap k v
t2
go Int
s t1 :: HashMap k v
t1@(Collision Word
h1 Array (Leaf k v)
ls1) t2 :: HashMap k v
t2@(Leaf Word
h2 (L k
k2 v
v2))
| Word
h1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
h2 = Word -> Array (Leaf k v) -> HashMap k v
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h1 ((k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
forall k v.
Eq k =>
(k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
updateOrSnocWithKey ((v -> v -> v) -> v -> v -> v
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((v -> v -> v) -> v -> v -> v)
-> (k -> v -> v -> v) -> k -> v -> v -> v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> v -> v -> v
f) k
k2 v
v2 Array (Leaf k v)
ls1)
| Bool
otherwise = Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
forall {k} {v}.
Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
goDifferentHash Int
s Word
h1 Word
h2 HashMap k v
t1 HashMap k v
t2
go Int
s t1 :: HashMap k v
t1@(Collision Word
h1 Array (Leaf k v)
ls1) t2 :: HashMap k v
t2@(Collision Word
h2 Array (Leaf k v)
ls2)
| Word
h1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
h2 = Word -> Array (Leaf k v) -> HashMap k v
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h1 ((k -> v -> v -> (# v #))
-> Array (Leaf k v) -> Array (Leaf k v) -> Array (Leaf k v)
forall k v.
Eq k =>
(k -> v -> v -> (# v #))
-> Array (Leaf k v) -> Array (Leaf k v) -> Array (Leaf k v)
HM.updateOrConcatWithKey (\k
k v
a v
b -> let !v :: v
v = k -> v -> v -> v
f k
k v
a v
b in (# v
v #)) Array (Leaf k v)
ls1 Array (Leaf k v)
ls2)
| Bool
otherwise = Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
forall {k} {v}.
Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
goDifferentHash Int
s Word
h1 Word
h2 HashMap k v
t1 HashMap k v
t2
go Int
s (BitmapIndexed Word
b1 Array (HashMap k v)
ary1) (BitmapIndexed Word
b2 Array (HashMap k v)
ary2) =
let b' :: Word
b' = Word
b1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word
b2
ary' :: Array (HashMap k v)
ary' = (HashMap k v -> HashMap k v -> HashMap k v)
-> Word
-> Word
-> Array (HashMap k v)
-> Array (HashMap k v)
-> Array (HashMap k v)
forall a.
(a -> a -> a) -> Word -> Word -> Array a -> Array a -> Array a
HM.unionArrayBy (Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s)) Word
b1 Word
b2 Array (HashMap k v)
ary1 Array (HashMap k v)
ary2
in Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
HM.bitmapIndexedOrFull Word
b' Array (HashMap k v)
ary'
go Int
s (BitmapIndexed Word
b1 Array (HashMap k v)
ary1) (Full Array (HashMap k v)
ary2) =
let ary' :: Array (HashMap k v)
ary' = (HashMap k v -> HashMap k v -> HashMap k v)
-> Word
-> Word
-> Array (HashMap k v)
-> Array (HashMap k v)
-> Array (HashMap k v)
forall a.
(a -> a -> a) -> Word -> Word -> Array a -> Array a -> Array a
HM.unionArrayBy (Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s)) Word
b1 Word
fullBitmap Array (HashMap k v)
ary1 Array (HashMap k v)
ary2
in Array (HashMap k v) -> HashMap k v
forall k v. Array (HashMap k v) -> HashMap k v
Full Array (HashMap k v)
ary'
go Int
s (Full Array (HashMap k v)
ary1) (BitmapIndexed Word
b2 Array (HashMap k v)
ary2) =
let ary' :: Array (HashMap k v)
ary' = (HashMap k v -> HashMap k v -> HashMap k v)
-> Word
-> Word
-> Array (HashMap k v)
-> Array (HashMap k v)
-> Array (HashMap k v)
forall a.
(a -> a -> a) -> Word -> Word -> Array a -> Array a -> Array a
HM.unionArrayBy (Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s)) Word
fullBitmap Word
b2 Array (HashMap k v)
ary1 Array (HashMap k v)
ary2
in Array (HashMap k v) -> HashMap k v
forall k v. Array (HashMap k v) -> HashMap k v
Full Array (HashMap k v)
ary'
go Int
s (Full Array (HashMap k v)
ary1) (Full Array (HashMap k v)
ary2) =
let ary' :: Array (HashMap k v)
ary' = (HashMap k v -> HashMap k v -> HashMap k v)
-> Word
-> Word
-> Array (HashMap k v)
-> Array (HashMap k v)
-> Array (HashMap k v)
forall a.
(a -> a -> a) -> Word -> Word -> Array a -> Array a -> Array a
HM.unionArrayBy (Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s)) Word
fullBitmap Word
fullBitmap
Array (HashMap k v)
ary1 Array (HashMap k v)
ary2
in Array (HashMap k v) -> HashMap k v
forall k v. Array (HashMap k v) -> HashMap k v
Full Array (HashMap k v)
ary'
go Int
s (BitmapIndexed Word
b1 Array (HashMap k v)
ary1) HashMap k v
t2
| Word
b1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
m2 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 = let ary' :: Array (HashMap k v)
ary' = Array (HashMap k v) -> Int -> HashMap k v -> Array (HashMap k v)
forall e. Array e -> Int -> e -> Array e
A.insert Array (HashMap k v)
ary1 Int
i HashMap k v
t2
b' :: Word
b' = Word
b1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word
m2
in Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
HM.bitmapIndexedOrFull Word
b' Array (HashMap k v)
ary'
| Bool
otherwise = let ary' :: Array (HashMap k v)
ary' = Array (HashMap k v)
-> Int -> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall e. Array e -> Int -> (e -> e) -> Array e
A.updateWith' Array (HashMap k v)
ary1 Int
i ((HashMap k v -> HashMap k v) -> Array (HashMap k v))
-> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall a b. (a -> b) -> a -> b
$ \HashMap k v
st1 ->
Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s) HashMap k v
st1 HashMap k v
t2
in Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed Word
b1 Array (HashMap k v)
ary'
where
h2 :: Word
h2 = HashMap k v -> Word
forall {k} {v}. HashMap k v -> Word
leafHashCode HashMap k v
t2
m2 :: Word
m2 = Word -> Int -> Word
mask Word
h2 Int
s
i :: Int
i = Word -> Word -> Int
sparseIndex Word
b1 Word
m2
go Int
s HashMap k v
t1 (BitmapIndexed Word
b2 Array (HashMap k v)
ary2)
| Word
b2 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
m1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 = let ary' :: Array (HashMap k v)
ary' = Array (HashMap k v) -> Int -> HashMap k v -> Array (HashMap k v)
forall e. Array e -> Int -> e -> Array e
A.insert Array (HashMap k v)
ary2 Int
i (HashMap k v -> Array (HashMap k v))
-> HashMap k v -> Array (HashMap k v)
forall a b. (a -> b) -> a -> b
$! HashMap k v
t1
b' :: Word
b' = Word
b2 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word
m1
in Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
HM.bitmapIndexedOrFull Word
b' Array (HashMap k v)
ary'
| Bool
otherwise = let ary' :: Array (HashMap k v)
ary' = Array (HashMap k v)
-> Int -> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall e. Array e -> Int -> (e -> e) -> Array e
A.updateWith' Array (HashMap k v)
ary2 Int
i ((HashMap k v -> HashMap k v) -> Array (HashMap k v))
-> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall a b. (a -> b) -> a -> b
$ \HashMap k v
st2 ->
Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s) HashMap k v
t1 HashMap k v
st2
in Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed Word
b2 Array (HashMap k v)
ary'
where
h1 :: Word
h1 = HashMap k v -> Word
forall {k} {v}. HashMap k v -> Word
leafHashCode HashMap k v
t1
m1 :: Word
m1 = Word -> Int -> Word
mask Word
h1 Int
s
i :: Int
i = Word -> Word -> Int
sparseIndex Word
b2 Word
m1
go Int
s (Full Array (HashMap k v)
ary1) HashMap k v
t2 =
let h2 :: Word
h2 = HashMap k v -> Word
forall {k} {v}. HashMap k v -> Word
leafHashCode HashMap k v
t2
i :: Int
i = Word -> Int -> Int
index Word
h2 Int
s
ary' :: Array (HashMap k v)
ary' = Array (HashMap k v)
-> Int -> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall e. Array e -> Int -> (e -> e) -> Array e
HM.updateFullArrayWith' Array (HashMap k v)
ary1 Int
i ((HashMap k v -> HashMap k v) -> Array (HashMap k v))
-> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall a b. (a -> b) -> a -> b
$ \HashMap k v
st1 -> Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s) HashMap k v
st1 HashMap k v
t2
in Array (HashMap k v) -> HashMap k v
forall k v. Array (HashMap k v) -> HashMap k v
Full Array (HashMap k v)
ary'
go Int
s HashMap k v
t1 (Full Array (HashMap k v)
ary2) =
let h1 :: Word
h1 = HashMap k v -> Word
forall {k} {v}. HashMap k v -> Word
leafHashCode HashMap k v
t1
i :: Int
i = Word -> Int -> Int
index Word
h1 Int
s
ary' :: Array (HashMap k v)
ary' = Array (HashMap k v)
-> Int -> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall e. Array e -> Int -> (e -> e) -> Array e
HM.updateFullArrayWith' Array (HashMap k v)
ary2 Int
i ((HashMap k v -> HashMap k v) -> Array (HashMap k v))
-> (HashMap k v -> HashMap k v) -> Array (HashMap k v)
forall a b. (a -> b) -> a -> b
$ \HashMap k v
st2 -> Int -> HashMap k v -> HashMap k v -> HashMap k v
go (Int -> Int
nextShift Int
s) HashMap k v
t1 HashMap k v
st2
in Array (HashMap k v) -> HashMap k v
forall k v. Array (HashMap k v) -> HashMap k v
Full Array (HashMap k v)
ary'
leafHashCode :: HashMap k v -> Word
leafHashCode (Leaf Word
h Leaf k v
_) = Word
h
leafHashCode (Collision Word
h Array (Leaf k v)
_) = Word
h
leafHashCode HashMap k v
_ = [Char] -> Word
forall a. HasCallStack => [Char] -> a
error [Char]
"leafHashCode"
goDifferentHash :: Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
goDifferentHash Int
s Word
h1 Word
h2 HashMap k v
t1 HashMap k v
t2
| Word
m1 Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
m2 = Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed Word
m1 (HashMap k v -> Array (HashMap k v)
forall a. a -> Array a
A.singleton (HashMap k v -> Array (HashMap k v))
-> HashMap k v -> Array (HashMap k v)
forall a b. (a -> b) -> a -> b
$! Int -> Word -> Word -> HashMap k v -> HashMap k v -> HashMap k v
goDifferentHash (Int -> Int
nextShift Int
s) Word
h1 Word
h2 HashMap k v
t1 HashMap k v
t2)
| Word
m1 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
m2 = Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed (Word
m1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word
m2) (HashMap k v -> HashMap k v -> Array (HashMap k v)
forall a. a -> a -> Array a
A.pair HashMap k v
t1 HashMap k v
t2)
| Bool
otherwise = Word -> Array (HashMap k v) -> HashMap k v
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed (Word
m1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word
m2) (HashMap k v -> HashMap k v -> Array (HashMap k v)
forall a. a -> a -> Array a
A.pair HashMap k v
t2 HashMap k v
t1)
where
m1 :: Word
m1 = Word -> Int -> Word
mask Word
h1 Int
s
m2 :: Word
m2 = Word -> Int -> Word
mask Word
h2 Int
s
{-# INLINE unionWithKey #-}
mapWithKey :: (k -> v1 -> v2) -> HashMap k v1 -> HashMap k v2
mapWithKey :: forall k v1 v2. (k -> v1 -> v2) -> HashMap k v1 -> HashMap k v2
mapWithKey k -> v1 -> v2
f = HashMap k v1 -> HashMap k v2
go
where
go :: HashMap k v1 -> HashMap k v2
go HashMap k v1
Empty = HashMap k v2
forall k v. HashMap k v
Empty
go (Leaf Word
h (L k
k v1
v)) = Word -> k -> v2 -> HashMap k v2
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k (k -> v1 -> v2
f k
k v1
v)
go (BitmapIndexed Word
b Array (HashMap k v1)
ary) = Word -> Array (HashMap k v2) -> HashMap k v2
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed Word
b (Array (HashMap k v2) -> HashMap k v2)
-> Array (HashMap k v2) -> HashMap k v2
forall a b. (a -> b) -> a -> b
$ (HashMap k v1 -> HashMap k v2)
-> Array (HashMap k v1) -> Array (HashMap k v2)
forall a b. (a -> b) -> Array a -> Array b
A.map' HashMap k v1 -> HashMap k v2
go Array (HashMap k v1)
ary
go (Full Array (HashMap k v1)
ary) = Array (HashMap k v2) -> HashMap k v2
forall k v. Array (HashMap k v) -> HashMap k v
Full (Array (HashMap k v2) -> HashMap k v2)
-> Array (HashMap k v2) -> HashMap k v2
forall a b. (a -> b) -> a -> b
$ (HashMap k v1 -> HashMap k v2)
-> Array (HashMap k v1) -> Array (HashMap k v2)
forall a b. (a -> b) -> Array a -> Array b
A.map' HashMap k v1 -> HashMap k v2
go Array (HashMap k v1)
ary
go (Collision Word
h Array (Leaf k v1)
ary) =
Word -> Array (Leaf k v2) -> HashMap k v2
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h (Array (Leaf k v2) -> HashMap k v2)
-> Array (Leaf k v2) -> HashMap k v2
forall a b. (a -> b) -> a -> b
$ (Leaf k v1 -> Leaf k v2) -> Array (Leaf k v1) -> Array (Leaf k v2)
forall a b. (a -> b) -> Array a -> Array b
A.map' (\ (L k
k v1
v) -> let !v' :: v2
v' = k -> v1 -> v2
f k
k v1
v in k -> v2 -> Leaf k v2
forall k v. k -> v -> Leaf k v
L k
k v2
v') Array (Leaf k v1)
ary
{-# INLINE mapWithKey #-}
map :: (v1 -> v2) -> HashMap k v1 -> HashMap k v2
map :: forall v1 v2 k. (v1 -> v2) -> HashMap k v1 -> HashMap k v2
map v1 -> v2
f = (k -> v1 -> v2) -> HashMap k v1 -> HashMap k v2
forall k v1 v2. (k -> v1 -> v2) -> HashMap k v1 -> HashMap k v2
mapWithKey ((v1 -> v2) -> k -> v1 -> v2
forall a b. a -> b -> a
const v1 -> v2
f)
{-# INLINE map #-}
mapMaybeWithKey :: (k -> v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2
mapMaybeWithKey :: forall k v1 v2.
(k -> v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2
mapMaybeWithKey k -> v1 -> Maybe v2
f = (HashMap k v1 -> Maybe (HashMap k v2))
-> (Leaf k v1 -> Maybe (Leaf k v2)) -> HashMap k v1 -> HashMap k v2
forall k v1 v2.
(HashMap k v1 -> Maybe (HashMap k v2))
-> (Leaf k v1 -> Maybe (Leaf k v2)) -> HashMap k v1 -> HashMap k v2
HM.filterMapAux HashMap k v1 -> Maybe (HashMap k v2)
onLeaf Leaf k v1 -> Maybe (Leaf k v2)
onColl
where onLeaf :: HashMap k v1 -> Maybe (HashMap k v2)
onLeaf (Leaf Word
h (L k
k v1
v)) | Just v2
v' <- k -> v1 -> Maybe v2
f k
k v1
v = HashMap k v2 -> Maybe (HashMap k v2)
forall a. a -> Maybe a
Just (Word -> k -> v2 -> HashMap k v2
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k v2
v')
onLeaf HashMap k v1
_ = Maybe (HashMap k v2)
forall a. Maybe a
Nothing
onColl :: Leaf k v1 -> Maybe (Leaf k v2)
onColl (L k
k v1
v) | Just !v2
v' <- k -> v1 -> Maybe v2
f k
k v1
v = Leaf k v2 -> Maybe (Leaf k v2)
forall a. a -> Maybe a
Just (k -> v2 -> Leaf k v2
forall k v. k -> v -> Leaf k v
L k
k v2
v')
| Bool
otherwise = Maybe (Leaf k v2)
forall a. Maybe a
Nothing
{-# INLINE mapMaybeWithKey #-}
mapMaybe :: (v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2
mapMaybe :: forall v1 v2 k. (v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2
mapMaybe v1 -> Maybe v2
f = (k -> v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2
forall k v1 v2.
(k -> v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2
mapMaybeWithKey ((v1 -> Maybe v2) -> k -> v1 -> Maybe v2
forall a b. a -> b -> a
const v1 -> Maybe v2
f)
{-# INLINE mapMaybe #-}
traverseWithKey
:: Applicative f
=> (k -> v1 -> f v2)
-> HashMap k v1 -> f (HashMap k v2)
traverseWithKey :: forall (f :: * -> *) k v1 v2.
Applicative f =>
(k -> v1 -> f v2) -> HashMap k v1 -> f (HashMap k v2)
traverseWithKey k -> v1 -> f v2
f = HashMap k v1 -> f (HashMap k v2)
go
where
go :: HashMap k v1 -> f (HashMap k v2)
go HashMap k v1
Empty = HashMap k v2 -> f (HashMap k v2)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure HashMap k v2
forall k v. HashMap k v
Empty
go (Leaf Word
h (L k
k v1
v)) = Word -> k -> v2 -> HashMap k v2
forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k (v2 -> HashMap k v2) -> f v2 -> f (HashMap k v2)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k -> v1 -> f v2
f k
k v1
v
go (BitmapIndexed Word
b Array (HashMap k v1)
ary) = Word -> Array (HashMap k v2) -> HashMap k v2
forall k v. Word -> Array (HashMap k v) -> HashMap k v
BitmapIndexed Word
b (Array (HashMap k v2) -> HashMap k v2)
-> f (Array (HashMap k v2)) -> f (HashMap k v2)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (HashMap k v1 -> f (HashMap k v2))
-> Array (HashMap k v1) -> f (Array (HashMap k v2))
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Array a -> f (Array b)
A.traverse' HashMap k v1 -> f (HashMap k v2)
go Array (HashMap k v1)
ary
go (Full Array (HashMap k v1)
ary) = Array (HashMap k v2) -> HashMap k v2
forall k v. Array (HashMap k v) -> HashMap k v
Full (Array (HashMap k v2) -> HashMap k v2)
-> f (Array (HashMap k v2)) -> f (HashMap k v2)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (HashMap k v1 -> f (HashMap k v2))
-> Array (HashMap k v1) -> f (Array (HashMap k v2))
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Array a -> f (Array b)
A.traverse' HashMap k v1 -> f (HashMap k v2)
go Array (HashMap k v1)
ary
go (Collision Word
h Array (Leaf k v1)
ary) =
Word -> Array (Leaf k v2) -> HashMap k v2
forall k v. Word -> Array (Leaf k v) -> HashMap k v
Collision Word
h (Array (Leaf k v2) -> HashMap k v2)
-> f (Array (Leaf k v2)) -> f (HashMap k v2)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Leaf k v1 -> f (Leaf k v2))
-> Array (Leaf k v1) -> f (Array (Leaf k v2))
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Array a -> f (Array b)
A.traverse' (\ (L k
k v1
v) -> (k -> v2 -> Leaf k v2
forall k v. k -> v -> Leaf k v
L k
k (v2 -> Leaf k v2) -> v2 -> Leaf k v2
forall a b. (a -> b) -> a -> b
$!) (v2 -> Leaf k v2) -> f v2 -> f (Leaf k v2)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k -> v1 -> f v2
f k
k v1
v) Array (Leaf k v1)
ary
{-# INLINE traverseWithKey #-}
differenceWith :: Hashable k => (v -> w -> Maybe v) -> HashMap k v -> HashMap k w -> HashMap k v
differenceWith :: forall k v w.
Hashable k =>
(v -> w -> Maybe v) -> HashMap k v -> HashMap k w -> HashMap k v
differenceWith v -> w -> Maybe v
f = (k -> v -> w -> Maybe v)
-> HashMap k v -> HashMap k w -> HashMap k v
forall k v w.
Eq k =>
(k -> v -> w -> Maybe v)
-> HashMap k v -> HashMap k w -> HashMap k v
HM.differenceWithKey ((k -> v -> w -> Maybe v)
-> HashMap k v -> HashMap k w -> HashMap k v)
-> (k -> v -> w -> Maybe v)
-> HashMap k v
-> HashMap k w
-> HashMap k v
forall a b. (a -> b) -> a -> b
$
\k
_k v
vA w
vB -> case v -> w -> Maybe v
f v
vA w
vB of
Maybe v
Nothing -> Maybe v
forall a. Maybe a
Nothing
x :: Maybe v
x@(Just v
v) -> v
v v -> Maybe v -> Maybe v
forall a b. a -> b -> b
`seq` Maybe v
x
{-# INLINE differenceWith #-}
differenceWithKey :: Eq k => (k -> v -> w -> Maybe v) -> HashMap k v -> HashMap k w -> HashMap k v
differenceWithKey :: forall k v w.
Eq k =>
(k -> v -> w -> Maybe v)
-> HashMap k v -> HashMap k w -> HashMap k v
differenceWithKey k -> v -> w -> Maybe v
f = (k -> v -> w -> Maybe v)
-> HashMap k v -> HashMap k w -> HashMap k v
forall k v w.
Eq k =>
(k -> v -> w -> Maybe v)
-> HashMap k v -> HashMap k w -> HashMap k v
HM.differenceWithKey ((k -> v -> w -> Maybe v)
-> HashMap k v -> HashMap k w -> HashMap k v)
-> (k -> v -> w -> Maybe v)
-> HashMap k v
-> HashMap k w
-> HashMap k v
forall a b. (a -> b) -> a -> b
$
\k
k v
vA w
vB -> case k -> v -> w -> Maybe v
f k
k v
vA w
vB of
Maybe v
Nothing -> Maybe v
forall a. Maybe a
Nothing
x :: Maybe v
x@(Just v
v) -> v
v v -> Maybe v -> Maybe v
forall a b. a -> b -> b
`seq` Maybe v
x
{-# INLINE differenceWithKey #-}
intersectionWith :: Eq k => (v1 -> v2 -> v3) -> HashMap k v1
-> HashMap k v2 -> HashMap k v3
intersectionWith :: forall k v1 v2 v3.
Eq k =>
(v1 -> v2 -> v3) -> HashMap k v1 -> HashMap k v2 -> HashMap k v3
intersectionWith v1 -> v2 -> v3
f = ((k -> v1 -> v2 -> v3)
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3)
-> (k -> v1 -> v2 -> v3)
-> HashMap k v1
-> HashMap k v2
-> HashMap k v3
forall a. a -> a
Exts.inline (k -> v1 -> v2 -> v3)
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3
forall k v1 v2 v3.
Eq k =>
(k -> v1 -> v2 -> v3)
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3
intersectionWithKey ((k -> v1 -> v2 -> v3)
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3)
-> (k -> v1 -> v2 -> v3)
-> HashMap k v1
-> HashMap k v2
-> HashMap k v3
forall a b. (a -> b) -> a -> b
$ (v1 -> v2 -> v3) -> k -> v1 -> v2 -> v3
forall a b. a -> b -> a
const v1 -> v2 -> v3
f
{-# INLINABLE intersectionWith #-}
intersectionWithKey :: Eq k => (k -> v1 -> v2 -> v3)
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3
intersectionWithKey :: forall k v1 v2 v3.
Eq k =>
(k -> v1 -> v2 -> v3)
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3
intersectionWithKey k -> v1 -> v2 -> v3
f = (k -> v1 -> v2 -> (# v3 #))
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3
forall k v1 v2 v3.
Eq k =>
(k -> v1 -> v2 -> (# v3 #))
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3
HM.intersectionWithKey# ((k -> v1 -> v2 -> (# v3 #))
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3)
-> (k -> v1 -> v2 -> (# v3 #))
-> HashMap k v1
-> HashMap k v2
-> HashMap k v3
forall a b. (a -> b) -> a -> b
$ \k
k v1
v1 v2
v2 -> let !v3 :: v3
v3 = k -> v1 -> v2 -> v3
f k
k v1
v1 v2
v2 in (# v3
v3 #)
{-# INLINABLE intersectionWithKey #-}
fromList :: Hashable k => [(k, v)] -> HashMap k v
fromList :: forall k v. Hashable k => [(k, v)] -> HashMap k v
fromList = (HashMap k v -> (k, v) -> HashMap k v)
-> HashMap k v -> [(k, v)] -> HashMap k v
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (\ HashMap k v
m (k
k, !v
v) -> k -> v -> HashMap k v -> HashMap k v
forall k v. Hashable k => k -> v -> HashMap k v -> HashMap k v
HM.unsafeInsert k
k v
v HashMap k v
m) HashMap k v
forall k v. HashMap k v
HM.empty
{-# INLINABLE fromList #-}
fromListWith :: Hashable k => (v -> v -> v) -> [(k, v)] -> HashMap k v
fromListWith :: forall k v. Hashable k => (v -> v -> v) -> [(k, v)] -> HashMap k v
fromListWith v -> v -> v
f = (HashMap k v -> (k, v) -> HashMap k v)
-> HashMap k v -> [(k, v)] -> HashMap k v
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (\ HashMap k v
m (k
k, v
v) -> (v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
forall k v.
Hashable k =>
(v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
unsafeInsertWith v -> v -> v
f k
k v
v HashMap k v
m) HashMap k v
forall k v. HashMap k v
HM.empty
{-# INLINE fromListWith #-}
fromListWithKey :: Hashable k => (k -> v -> v -> v) -> [(k, v)] -> HashMap k v
fromListWithKey :: forall k v.
Hashable k =>
(k -> v -> v -> v) -> [(k, v)] -> HashMap k v
fromListWithKey k -> v -> v -> v
f = (HashMap k v -> (k, v) -> HashMap k v)
-> HashMap k v -> [(k, v)] -> HashMap k v
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (\ HashMap k v
m (k
k, v
v) -> (k -> v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
forall k v.
Hashable k =>
(k -> v -> v -> v) -> k -> v -> HashMap k v -> HashMap k v
unsafeInsertWithKey k -> v -> v -> v
f k
k v
v HashMap k v
m) HashMap k v
forall k v. HashMap k v
HM.empty
{-# INLINE fromListWithKey #-}
updateWith :: Eq k => (v -> v) -> k -> A.Array (Leaf k v) -> A.Array (Leaf k v)
updateWith :: forall k v.
Eq k =>
(v -> v) -> k -> Array (Leaf k v) -> Array (Leaf k v)
updateWith v -> v
f k
k0 Array (Leaf k v)
ary0 = k -> Array (Leaf k v) -> Int -> Int -> Array (Leaf k v)
forall {t}.
Eq t =>
t -> Array (Leaf t v) -> Int -> Int -> Array (Leaf t v)
go k
k0 Array (Leaf k v)
ary0 Int
0 (Array (Leaf k v) -> Int
forall a. Array a -> Int
A.length Array (Leaf k v)
ary0)
where
go :: t -> Array (Leaf t v) -> Int -> Int -> Array (Leaf t v)
go !t
k !Array (Leaf t v)
ary !Int
i !Int
n
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = Array (Leaf t v)
ary
| Bool
otherwise = case Array (Leaf t v) -> Int -> (# Leaf t v #)
forall a. Array a -> Int -> (# a #)
A.index# Array (Leaf t v)
ary Int
i of
(# L t
kx v
y #) | t
k t -> t -> Bool
forall a. Eq a => a -> a -> Bool
== t
kx -> let !v' :: v
v' = v -> v
f v
y in Array (Leaf t v) -> Int -> Leaf t v -> Array (Leaf t v)
forall e. Array e -> Int -> e -> Array e
A.update Array (Leaf t v)
ary Int
i (t -> v -> Leaf t v
forall k v. k -> v -> Leaf k v
L t
k v
v')
| Bool
otherwise -> t -> Array (Leaf t v) -> Int -> Int -> Array (Leaf t v)
go t
k Array (Leaf t v)
ary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
n
{-# INLINABLE updateWith #-}
updateOrSnocWith :: Eq k => (v -> v -> v) -> k -> v -> A.Array (Leaf k v)
-> A.Array (Leaf k v)
updateOrSnocWith :: forall k v.
Eq k =>
(v -> v -> v) -> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
updateOrSnocWith v -> v -> v
f = (k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
forall k v.
Eq k =>
(k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
updateOrSnocWithKey ((v -> v -> v) -> k -> v -> v -> v
forall a b. a -> b -> a
const v -> v -> v
f)
{-# INLINABLE updateOrSnocWith #-}
updateOrSnocWithKey :: Eq k => (k -> v -> v -> v) -> k -> v -> A.Array (Leaf k v)
-> A.Array (Leaf k v)
updateOrSnocWithKey :: forall k v.
Eq k =>
(k -> v -> v -> v)
-> k -> v -> Array (Leaf k v) -> Array (Leaf k v)
updateOrSnocWithKey k -> v -> v -> v
f k
k0 v
v0 Array (Leaf k v)
ary0 = k -> v -> Array (Leaf k v) -> Int -> Int -> Array (Leaf k v)
go k
k0 v
v0 Array (Leaf k v)
ary0 Int
0 (Array (Leaf k v) -> Int
forall a. Array a -> Int
A.length Array (Leaf k v)
ary0)
where
go :: k -> v -> Array (Leaf k v) -> Int -> Int -> Array (Leaf k v)
go !k
k v
v !Array (Leaf k v)
ary !Int
i !Int
n
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = Array (Leaf k v) -> Leaf k v -> Array (Leaf k v)
forall a. Array a -> a -> Array a
A.snoc Array (Leaf k v)
ary (Leaf k v -> Array (Leaf k v)) -> Leaf k v -> Array (Leaf k v)
forall a b. (a -> b) -> a -> b
$! k -> v -> Leaf k v
forall k v. k -> v -> Leaf k v
L k
k (v -> Leaf k v) -> v -> Leaf k v
forall a b. (a -> b) -> a -> b
$! v
v
| Bool
otherwise = case Array (Leaf k v) -> Int -> (# Leaf k v #)
forall a. Array a -> Int -> (# a #)
A.index# Array (Leaf k v)
ary Int
i of
(# L k
kx v
y #) | k
k k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
kx -> let !v' :: v
v' = k -> v -> v -> v
f k
k v
v v
y in Array (Leaf k v) -> Int -> Leaf k v -> Array (Leaf k v)
forall e. Array e -> Int -> e -> Array e
A.update Array (Leaf k v)
ary Int
i (k -> v -> Leaf k v
forall k v. k -> v -> Leaf k v
L k
k v
v')
| Bool
otherwise -> k -> v -> Array (Leaf k v) -> Int -> Int -> Array (Leaf k v)
go k
k v
v Array (Leaf k v)
ary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
n
{-# INLINABLE updateOrSnocWithKey #-}
leaf :: Hash -> k -> v -> HashMap k v
leaf :: forall k v. Word -> k -> v -> HashMap k v
leaf Word
h k
k = \ !v
v -> Word -> Leaf k v -> HashMap k v
forall k v. Word -> Leaf k v -> HashMap k v
Leaf Word
h (k -> v -> Leaf k v
forall k v. k -> v -> Leaf k v
L k
k v
v)
{-# INLINE leaf #-}