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 :: forall k (m :: * -> *) v1 v2.
(Eq k, Hashable k, Monad m) =>
HashMap k v1 -> (k -> v1 -> m v2) -> m (HashMap k v2)
forWithKeyM = forall a b c. (a -> b -> c) -> b -> a -> c
flip 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_ :: forall k (m :: * -> *) v1.
(Eq k, Hashable k, Monad m) =>
HashMap k v1 -> (k -> v1 -> m ()) -> m ()
forWithKeyM_ = forall a b c. (a -> b -> c) -> b -> a -> c
flip 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 :: forall k (m :: * -> *) v1 v2.
(Eq k, Hashable k, Monad m) =>
(k -> v1 -> m v2) -> HashMap k v1 -> m (HashMap k v2)
mapWithKeyM k -> v1 -> m v2
f HashMap k v1
m = do
  forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Monoid a => [a] -> a
mconcat forall a b. (a -> b) -> a -> b
$
    forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (forall k v. HashMap k v -> [(k, v)]
HMS.toList HashMap k v1
m) forall a b. (a -> b) -> a -> b
$ \(k
k, v1
v) ->
      forall k v. Hashable k => k -> v -> HashMap k v
HMS.singleton k
k 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_ :: forall k (m :: * -> *) v1.
(Eq k, Hashable k, Monad m) =>
(k -> v1 -> m ()) -> HashMap k v1 -> m ()
mapWithKeyM_ k -> v1 -> m ()
f HashMap k v1
m = do
  forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (forall k v. HashMap k v -> [(k, v)]
HMS.toList HashMap k v1
m) forall a b. (a -> b) -> a -> b
$ \(k
k, v1
v) ->
    forall k v. Hashable k => k -> v -> HashMap k v
HMS.singleton k
k forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k -> v1 -> m ()
f k
k v1
v