@@ -49,6 +49,7 @@ import Data.Text (Text, pack, unpack)
49import Data.Text.Encoding (encodeUtf8)
49import Data.Text.Encoding (encodeUtf8)
50import Data.Time.Clock (UTCTime)
50import Data.Time.Clock (UTCTime)
51import Data.Time.Format (FormatTime, formatTime, parseTime)
51import Data.Time.Format (FormatTime, formatTime, parseTime)
52+import Data.Traversable (traverse)
52import Data.Typeable (Typeable)
53import Data.Typeable (Typeable)
53import Data.Vector (Vector)
54import Data.Vector (Vector)
54import Data.Word (Word, Word8, Word16, Word32, Word64)
55import Data.Word (Word, Word8, Word16, Word32, Word64)
@@ -208,7 +209,7 @@ instance (ToJSON a, ToJSON b) => ToJSON (Either a b) where
208 {-# INLINE toJSON #-}
209 {-# INLINE toJSON #-}
210instance (FromJSON a, FromJSON b) => FromJSON (Either a b) where
211instance (FromJSON a, FromJSON b) => FromJSON (Either a b) where
211− parseJSON (Object (M.toList -> [(key, value)]))
212+ parseJSON (Object (H.toList -> [(key, value)]))
212 | key == left = Left <$> parseJSON value
213 | key == left = Left <$> parseJSON value
213 | key == right = Right <$> parseJSON value
214 | key == right = Right <$> parseJSON value
214 parseJSON _ = fail ""
215 parseJSON _ = fail ""
@@ -507,70 +508,68 @@ instance FromJSON a => FromJSON (IntMap.IntMap a) where
507 {-# INLINE parseJSON #-}
508 {-# INLINE parseJSON #-}
509instance (ToJSON v) => ToJSON (M.Map Text v) where
510instance (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
511 {-# INLINE toJSON #-}
512 {-# INLINE toJSON #-}
513instance (FromJSON v) => FromJSON (M.Map Text v) where
514instance (FromJSON v) => FromJSON (M.Map Text v) where
514− parseJSON (Object o) = M.fromAscList <$> mapM go (M.toAscList o)
515+ parseJSON (Object o) = H.foldrWithKey M.insert M.empty <$> traverse parseJSON o
515− where go (k,v) = ((,) k) <$> parseJSON v
516 parseJSON v = typeMismatch "Map Text a" v
516 parseJSON v = typeMismatch "Map Text a" v
518instance (ToJSON v) => ToJSON (M.Map LT.Text v) where
518instance (ToJSON v) => ToJSON (M.Map LT.Text v) where
519− toJSON = Object . transformMap LT.toStrict toJSON
519+ toJSON = Object . mapHashKeyVal LT.toStrict toJSON
521instance (FromJSON v) => FromJSON (M.Map LT.Text v) where
521instance (FromJSON v) => FromJSON (M.Map LT.Text v) where
522− parseJSON = fmap (M.mapKeysMonotonic LT.fromStrict) . parseJSON
522+ parseJSON = fmap (hashMapKey LT.fromStrict) . parseJSON
524instance (ToJSON v) => ToJSON (M.Map String v) where
524instance (ToJSON v) => ToJSON (M.Map String v) where
525− toJSON = Object . transformMap pack toJSON
525+ toJSON = Object . mapHashKeyVal pack toJSON
527instance (FromJSON v) => FromJSON (M.Map String v) where
527instance (FromJSON v) => FromJSON (M.Map String v) where
528− parseJSON = fmap (M.mapKeysMonotonic unpack) . parseJSON
528+ parseJSON = fmap (hashMapKey unpack) . parseJSON
530instance (ToJSON v) => ToJSON (M.Map B.ByteString v) where
530instance (ToJSON v) => ToJSON (M.Map B.ByteString v) where
531− toJSON = Object . transformMap decode toJSON
531+ toJSON = Object . mapHashKeyVal decode toJSON
533instance (FromJSON v) => FromJSON (M.Map B.ByteString v) where
533instance (FromJSON v) => FromJSON (M.Map B.ByteString v) where
534− parseJSON = fmap (M.mapKeysMonotonic encodeUtf8) . parseJSON
534+ parseJSON = fmap (hashMapKey encodeUtf8) . parseJSON
536instance (ToJSON v) => ToJSON (M.Map LB.ByteString v) where
536instance (ToJSON v) => ToJSON (M.Map LB.ByteString v) where
537− toJSON = Object . transformMap strict toJSON
537+ toJSON = Object . mapHashKeyVal strict toJSON
539instance (FromJSON v) => FromJSON (M.Map LB.ByteString v) where
539instance (FromJSON v) => FromJSON (M.Map LB.ByteString v) where
540− parseJSON = fmap (M.mapKeysMonotonic lazy) . parseJSON
540+ parseJSON = fmap (hashMapKey lazy) . parseJSON
542instance (ToJSON v) => ToJSON (H.HashMap Text v) where
542instance (ToJSON v) => ToJSON (H.HashMap Text v) where
543− toJSON = Object . hashMap id toJSON
543+ toJSON = Object . H.map toJSON
544 {-# INLINE toJSON #-}
544 {-# INLINE toJSON #-}
546instance (FromJSON v) => FromJSON (H.HashMap Text v) where
546instance (FromJSON v) => FromJSON (H.HashMap Text v) where
547− parseJSON (Object o) = H.fromList <$> mapM go (M.toList o)
547+ parseJSON (Object o) = traverse parseJSON o
548− where go (k,v) = ((,) k) <$> parseJSON v
549 parseJSON v = typeMismatch "HashMap Text a" v
548 parseJSON v = typeMismatch "HashMap Text a" v
551instance (ToJSON v) => ToJSON (H.HashMap LT.Text v) where
550instance (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
554instance (FromJSON v) => FromJSON (H.HashMap LT.Text v) where
553instance (FromJSON v) => FromJSON (H.HashMap LT.Text v) where
555− parseJSON = fmap (mapHash LT.fromStrict) . parseJSON
554+ parseJSON = fmap (mapKey LT.fromStrict) . parseJSON
557instance (ToJSON v) => ToJSON (H.HashMap String v) where
556instance (ToJSON v) => ToJSON (H.HashMap String v) where
558− toJSON = Object . hashMap pack toJSON
557+ toJSON = Object . mapKeyVal pack toJSON
560instance (FromJSON v) => FromJSON (H.HashMap String v) where
559instance (FromJSON v) => FromJSON (H.HashMap String v) where
561− parseJSON = fmap (mapHash unpack) . parseJSON
560+ parseJSON = fmap (mapKey unpack) . parseJSON
563instance (ToJSON v) => ToJSON (H.HashMap B.ByteString v) where
562instance (ToJSON v) => ToJSON (H.HashMap B.ByteString v) where
564− toJSON = Object . hashMap decode toJSON
563+ toJSON = Object . mapKeyVal decode toJSON
566instance (FromJSON v) => FromJSON (H.HashMap B.ByteString v) where
565instance (FromJSON v) => FromJSON (H.HashMap B.ByteString v) where
567− parseJSON = fmap (mapHash encodeUtf8) . parseJSON
566+ parseJSON = fmap (mapKey encodeUtf8) . parseJSON
569instance (ToJSON v) => ToJSON (H.HashMap LB.ByteString v) where
568instance (ToJSON v) => ToJSON (H.HashMap LB.ByteString v) where
570− toJSON = Object . hashMap strict toJSON
569+ toJSON = Object . mapKeyVal strict toJSON
572instance (FromJSON v) => FromJSON (H.HashMap LB.ByteString v) where
571instance (FromJSON v) => FromJSON (H.HashMap LB.ByteString v) where
573− parseJSON = fmap (mapHash lazy) . parseJSON
572+ parseJSON = fmap (mapKey lazy) . parseJSON
575instance ToJSON Value where
574instance ToJSON Value where
576 toJSON a = a
575 toJSON a = a
@@ -689,7 +688,7 @@ fromJSON = parse parseJSON
689-- in an object for it to be valid. If the key and value are
688-- in an object for it to be valid. If the key and value are
690-- optional, use '(.:?)' instead.
689-- optional, use '(.:?)' instead.
691(.:) :: (FromJSON a) => Object -> Text -> Parser a
690(.:) :: (FromJSON a) => Object -> Text -> Parser a
692−obj .: key = case M.lookup key obj of
691+obj .: key = case H.lookup key obj of
693 Nothing -> fail $ "key " ++ show key ++ " not present"
692 Nothing -> fail $ "key " ++ show key ++ " not present"
694 Just v -> parseJSON v
693 Just v -> parseJSON v
695{-# INLINE (.:) #-}
694{-# INLINE (.:) #-}
@@ -702,7 +701,7 @@ obj .: key = case M.lookup key obj of
702-- from an object without affecting its validity. If the key and
701-- from an object without affecting its validity. If the key and
703-- value are mandatory, use '(.:)' instead.
702-- value are mandatory, use '(.:)' instead.
704(.:?) :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
703(.:?) :: (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
706 Nothing -> pure Nothing
705 Nothing -> pure Nothing
707 Just v -> parseJSON v
706 Just v -> parseJSON v
708{-# INLINE (.:?) #-}
707{-# INLINE (.:?) #-}