{-# OPTIONS_GHC -Wno-redundant-constraints #-}

module Cereal.UnorderedContainers.Extras.StrictHashMap
  ( module Data.HashMap.Strict,
    traverse_,
    replicateM,
  )
where

import Cereal.UnorderedContainers.Prelude hiding (empty, insert, replicateM, traverse_)
import Data.HashMap.Strict

{-# INLINE traverse_ #-}
traverse_ :: (Applicative m) => (k -> v -> m ()) -> HashMap k v -> m ()
traverse_ :: forall (m :: * -> *) k v.
Applicative m =>
(k -> v -> m ()) -> HashMap k v -> m ()
traverse_ k -> v -> m ()
m =
  forall k v a. (k -> v -> a -> a) -> a -> HashMap k v -> a
foldrWithKey k -> v -> m () -> m ()
step forall {f :: * -> *}. Applicative f => f ()
init
  where
    init :: f ()
init = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    step :: k -> v -> m () -> m ()
step k
k v
v m ()
acc = k -> v -> m ()
m k
k v
v forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> m ()
acc

{-# INLINE replicateM #-}
replicateM :: (Monad m, Eq k, Hashable k) => Int -> m (k, v) -> m (HashMap k v)
replicateM :: forall (m :: * -> *) k v.
(Monad m, Eq k, Hashable k) =>
Int -> m (k, v) -> m (HashMap k v)
replicateM Int
amount m (k, v)
m =
  let iterate :: Int -> HashMap k v -> m (HashMap k v)
iterate Int
index !HashMap k v
state =
        if Int
index forall a. Ord a => a -> a -> Bool
< Int
amount
          then do
            (k
k, v
v) <- m (k, v)
m
            Int -> HashMap k v -> m (HashMap k v)
iterate (forall a. Enum a => a -> a
succ Int
index) (forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
insert k
k v
v HashMap k v
state)
          else forall (m :: * -> *) a. Monad m => a -> m a
return HashMap k v
state
   in Int -> HashMap k v -> m (HashMap k v)
iterate Int
0 forall k v. HashMap k v
empty