@@ -49,6 +49,7 @@ import Data.Text (Text, pack, unpack)
4949import Data.Text.Encoding (encodeUtf8)
5050import Data.Time.Clock (UTCTime)
5151import Data.Time.Format (FormatTime, formatTime, parseTime)
52+import Data.Traversable (traverse)
5253import Data.Typeable (Typeable)
5354import Data.Vector (Vector)
5455import Data.Word (Word, Word8, Word16, Word32, Word64)
@@ -208,7 +209,7 @@ instance (ToJSON a, ToJSON b) => ToJSON (Either a b) where
208209 {-# INLINE toJSON #-}
209210
210211instance (FromJSON a, FromJSON b) => FromJSON (Either a b) where
211− parseJSON (Object (M.toList -> [(key, value)]))
212+ parseJSON (Object (H.toList -> [(key, value)]))
212213 | key == left = Left <$> parseJSON value
213214 | key == right = Right <$> parseJSON value
214215 parseJSON _ = fail ""
@@ -507,70 +508,68 @@ instance FromJSON a => FromJSON (IntMap.IntMap a) where
507508 {-# INLINE parseJSON #-}
508509
509510instance (ToJSON v) => ToJSON (M.Map Text v) where
510− toJSON = Object . M.map toJSON
511+ toJSON = Object . M.foldrWithKey (\k -> H.insert k . toJSON) H.empty
511512 {-# INLINE toJSON #-}
512513
513514instance (FromJSON v) => FromJSON (M.Map Text v) where
514− parseJSON (Object o) = M.fromAscList <$> mapM go (M.toAscList o)
515− where go (k,v) = ((,) k) <$> parseJSON v
515+ parseJSON (Object o) = H.foldrWithKey M.insert M.empty <$> traverse parseJSON o
516516 parseJSON v = typeMismatch "Map Text a" v
517517
518518instance (ToJSON v) => ToJSON (M.Map LT.Text v) where
519− toJSON = Object . transformMap LT.toStrict toJSON
519+ toJSON = Object . mapHashKeyVal LT.toStrict toJSON
520520
521521instance (FromJSON v) => FromJSON (M.Map LT.Text v) where
522− parseJSON = fmap (M.mapKeysMonotonic LT.fromStrict) . parseJSON
522+ parseJSON = fmap (hashMapKey LT.fromStrict) . parseJSON
523523
524524instance (ToJSON v) => ToJSON (M.Map String v) where
525− toJSON = Object . transformMap pack toJSON
525+ toJSON = Object . mapHashKeyVal pack toJSON
526526
527527instance (FromJSON v) => FromJSON (M.Map String v) where
528− parseJSON = fmap (M.mapKeysMonotonic unpack) . parseJSON
528+ parseJSON = fmap (hashMapKey unpack) . parseJSON
529529
530530instance (ToJSON v) => ToJSON (M.Map B.ByteString v) where
531− toJSON = Object . transformMap decode toJSON
531+ toJSON = Object . mapHashKeyVal decode toJSON
532532
533533instance (FromJSON v) => FromJSON (M.Map B.ByteString v) where
534− parseJSON = fmap (M.mapKeysMonotonic encodeUtf8) . parseJSON
534+ parseJSON = fmap (hashMapKey encodeUtf8) . parseJSON
535535
536536instance (ToJSON v) => ToJSON (M.Map LB.ByteString v) where
537− toJSON = Object . transformMap strict toJSON
537+ toJSON = Object . mapHashKeyVal strict toJSON
538538
539539instance (FromJSON v) => FromJSON (M.Map LB.ByteString v) where
540− parseJSON = fmap (M.mapKeysMonotonic lazy) . parseJSON
540+ parseJSON = fmap (hashMapKey lazy) . parseJSON
541541
542542instance (ToJSON v) => ToJSON (H.HashMap Text v) where
543− toJSON = Object . hashMap id toJSON
543+ toJSON = Object . H.map toJSON
544544 {-# INLINE toJSON #-}
545545
546546instance (FromJSON v) => FromJSON (H.HashMap Text v) where
547− parseJSON (Object o) = H.fromList <$> mapM go (M.toList o)
548− where go (k,v) = ((,) k) <$> parseJSON v
547+ parseJSON (Object o) = traverse parseJSON o
549548 parseJSON v = typeMismatch "HashMap Text a" v
550549
551550instance (ToJSON v) => ToJSON (H.HashMap LT.Text v) where
552− toJSON = Object . M.fromList . H.foldrWithKey (\k v -> ((LT.toStrict k,toJSON v) :)) []
551+ toJSON = Object . mapKeyVal LT.toStrict toJSON
553552
554553instance (FromJSON v) => FromJSON (H.HashMap LT.Text v) where
555− parseJSON = fmap (mapHash LT.fromStrict) . parseJSON
554+ parseJSON = fmap (mapKey LT.fromStrict) . parseJSON
556555
557556instance (ToJSON v) => ToJSON (H.HashMap String v) where
558− toJSON = Object . hashMap pack toJSON
557+ toJSON = Object . mapKeyVal pack toJSON
559558
560559instance (FromJSON v) => FromJSON (H.HashMap String v) where
561− parseJSON = fmap (mapHash unpack) . parseJSON
560+ parseJSON = fmap (mapKey unpack) . parseJSON
562561
563562instance (ToJSON v) => ToJSON (H.HashMap B.ByteString v) where
564− toJSON = Object . hashMap decode toJSON
563+ toJSON = Object . mapKeyVal decode toJSON
565564
566565instance (FromJSON v) => FromJSON (H.HashMap B.ByteString v) where
567− parseJSON = fmap (mapHash encodeUtf8) . parseJSON
566+ parseJSON = fmap (mapKey encodeUtf8) . parseJSON
568567
569568instance (ToJSON v) => ToJSON (H.HashMap LB.ByteString v) where
570− toJSON = Object . hashMap strict toJSON
569+ toJSON = Object . mapKeyVal strict toJSON
571570
572571instance (FromJSON v) => FromJSON (H.HashMap LB.ByteString v) where
573− parseJSON = fmap (mapHash lazy) . parseJSON
572+ parseJSON = fmap (mapKey lazy) . parseJSON
574573
575574instance ToJSON Value where
576575 toJSON a = a
@@ -689,7 +688,7 @@ fromJSON = parse parseJSON
689688-- in an object for it to be valid. If the key and value are
690689-- optional, use '(.:?)' instead.
691690(.:) :: (FromJSON a) => Object -> Text -> Parser a
692−obj .: key = case M.lookup key obj of
691+obj .: key = case H.lookup key obj of
693692 Nothing -> fail $ "key " ++ show key ++ " not present"
694693 Just v -> parseJSON v
695694{-# INLINE (.:) #-}
@@ -702,7 +701,7 @@ obj .: key = case M.lookup key obj of
702701-- from an object without affecting its validity. If the key and
703702-- value are mandatory, use '(.:)' instead.
704703(.:?) :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
705−obj .:? key = case M.lookup key obj of
704+obj .:? key = case H.lookup key obj of
706705 Nothing -> pure Nothing
707706 Just v -> parseJSON v
708707{-# INLINE (.:?) #-}