1{-# LANGUAGE NoImplicitPrelude #-}
2-- |
3-- Module:      Data.Aeson.Functions
4-- Copyright:   (c) 2011-2016 Bryan O'Sullivan
5--              (c) 2011 MailRank, Inc.
6-- License:     BSD3
7-- Maintainer:  Bryan O'Sullivan <bos@serpentine.com>
8-- Stability:   experimental
9-- Portability: portable
10
11module Data.Aeson.Internal.Functions
12    (
13      mapHashKeyVal
14    , mapKeyVal
15    , mapKey
16    ) where
17
18import Prelude.Compat
19
20import Data.Hashable (Hashable)
21import qualified Data.HashMap.Strict as H
22import qualified Data.Map as M
23
24-- | Transform a 'M.Map' into a 'H.HashMap' while transforming the keys.
25mapHashKeyVal :: (Eq k2, Hashable k2) => (k1 -> k2) -> (v1 -> v2)
26              -> M.Map k1 v1 -> H.HashMap k2 v2
27mapHashKeyVal fk kv = M.foldrWithKey (\k v -> H.insert (fk k) (kv v)) H.empty
28{-# INLINE mapHashKeyVal #-}
29
30-- | Transform the keys and values of a 'H.HashMap'.
31mapKeyVal :: (Eq k2, Hashable k2) => (k1 -> k2) -> (v1 -> v2)
32          -> H.HashMap k1 v1 -> H.HashMap k2 v2
33mapKeyVal fk kv = H.foldrWithKey (\k v -> H.insert (fk k) (kv v)) H.empty
34{-# INLINE mapKeyVal #-}
35
36-- | Transform the keys of a 'H.HashMap'.
37mapKey :: (Eq k2, Hashable k2) => (k1 -> k2) -> H.HashMap k1 v -> H.HashMap k2 v
38mapKey fk = mapKeyVal fk id
39{-# INLINE mapKey #-}
40