module Data.HashMap.Strict.Extended where

import Control.Monad
import qualified Data.HashMap.Strict as HMS
import Data.Hashable (Hashable)

--- HashMap

forWithKeyM ::
  (Eq k, Hashable k, Monad m) =>
  HMS.HashMap k v1 ->
  (k -> v1 -> m v2) ->
  m (HMS.HashMap k v2)
forWithKeyM :: HashMap k v1 -> (k -> v1 -> m v2) -> m (HashMap k v2)
forWithKeyM = ((k -> v1 -> m v2) -> HashMap k v1 -> m (HashMap k v2))
-> HashMap k v1 -> (k -> v1 -> m v2) -> m (HashMap k v2)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (k -> v1 -> m v2) -> HashMap k v1 -> m (HashMap k v2)
forall k (m :: * -> *) v1 v2.
(Eq k, Hashable k, Monad m) =>
(k -> v1 -> m v2) -> HashMap k v1 -> m (HashMap k v2)
mapWithKeyM

forWithKeyM_ ::
  (Eq k, Hashable k, Monad m) =>
  HMS.HashMap k v1 ->
  (k -> v1 -> m ()) ->
  m ()
forWithKeyM_ :: HashMap k v1 -> (k -> v1 -> m ()) -> m ()
forWithKeyM_ = ((k -> v1 -> m ()) -> HashMap k v1 -> m ())
-> HashMap k v1 -> (k -> v1 -> m ()) -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip (k -> v1 -> m ()) -> HashMap k v1 -> m ()
forall k (m :: * -> *) v1.
(Eq k, Hashable k, Monad m) =>
(k -> v1 -> m ()) -> HashMap k v1 -> m ()
mapWithKeyM_

mapWithKeyM ::
  (Eq k, Hashable k, Monad m) =>
  (k -> v1 -> m v2) ->
  HMS.HashMap k v1 ->
  m (HMS.HashMap k v2)
mapWithKeyM :: (k -> v1 -> m v2) -> HashMap k v1 -> m (HashMap k v2)
mapWithKeyM k -> v1 -> m v2
f HashMap k v1
m = do
  ([HashMap k v2] -> HashMap k v2)
-> m [HashMap k v2] -> m (HashMap k v2)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [HashMap k v2] -> HashMap k v2
forall a. Monoid a => [a] -> a
mconcat (m [HashMap k v2] -> m (HashMap k v2))
-> m [HashMap k v2] -> m (HashMap k v2)
forall a b. (a -> b) -> a -> b
$
    [(k, v1)] -> ((k, v1) -> m (HashMap k v2)) -> m [HashMap k v2]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (HashMap k v1 -> [(k, v1)]
forall k v. HashMap k v -> [(k, v)]
HMS.toList HashMap k v1
m) (((k, v1) -> m (HashMap k v2)) -> m [HashMap k v2])
-> ((k, v1) -> m (HashMap k v2)) -> m [HashMap k v2]
forall a b. (a -> b) -> a -> b
$ \(k
k, v1
v) ->
      k -> v2 -> HashMap k v2
forall k v. Hashable k => k -> v -> HashMap k v
HMS.singleton k
k (v2 -> HashMap k v2) -> m v2 -> m (HashMap k v2)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k -> v1 -> m v2
f k
k v1
v

mapWithKeyM_ ::
  (Eq k, Hashable k, Monad m) =>
  (k -> v1 -> m ()) ->
  HMS.HashMap k v1 ->
  m ()
mapWithKeyM_ :: (k -> v1 -> m ()) -> HashMap k v1 -> m ()
mapWithKeyM_ k -> v1 -> m ()
f HashMap k v1
m = do
  [(k, v1)] -> ((k, v1) -> m (HashMap k ())) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (HashMap k v1 -> [(k, v1)]
forall k v. HashMap k v -> [(k, v)]
HMS.toList HashMap k v1
m) (((k, v1) -> m (HashMap k ())) -> m ())
-> ((k, v1) -> m (HashMap k ())) -> m ()
forall a b. (a -> b) -> a -> b
$ \(k
k, v1
v) ->
    k -> () -> HashMap k ()
forall k v. Hashable k => k -> v -> HashMap k v
HMS.singleton k
k (() -> HashMap k ()) -> m () -> m (HashMap k ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k -> v1 -> m ()
f k
k v1
v