aeson-lens 0.3.0.0 → 0.3.0.1
raw patch · 2 files changed
+46/−20 lines, 2 filesdep ~lensPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: lens
API changes (from Hackage documentation)
+ Data.Aeson.Lens: key' :: (FromJSON u, ToJSON v) => Text -> IndexedLens ValueIx (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)
+ Data.Aeson.Lens: nth' :: (FromJSON u, ToJSON v) => Int -> IndexedLens ValueIx (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)
+ Data.Aeson.Lens: traverseArray' :: (FromJSON u, ToJSON v) => IndexedTraversal Int (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)
+ Data.Aeson.Lens: traverseObject' :: (FromJSON u, ToJSON v) => IndexedTraversal Text (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)
- Data.Aeson.Lens: key :: (ToJSON v, FromJSON v) => Text -> SimpleIndexedLens ValueIx (Maybe Value) (Maybe v)
+ Data.Aeson.Lens: key :: (FromJSON v, ToJSON v) => Text -> SimpleIndexedLens ValueIx (Maybe Value) (Maybe v)
- Data.Aeson.Lens: nth :: (ToJSON v, FromJSON v) => Int -> SimpleIndexedLens ValueIx (Maybe Value) (Maybe v)
+ Data.Aeson.Lens: nth :: (FromJSON v, ToJSON v) => Int -> SimpleIndexedLens ValueIx (Maybe Value) (Maybe v)
- Data.Aeson.Lens: traverseArray :: (ToJSON v, FromJSON v) => SimpleIndexedTraversal Int (Maybe Value) (Maybe v)
+ Data.Aeson.Lens: traverseArray :: (FromJSON v, ToJSON v) => SimpleIndexedTraversal Int (Maybe Value) (Maybe v)
- Data.Aeson.Lens: traverseObject :: (ToJSON v, FromJSON v) => SimpleIndexedTraversal Text (Maybe Value) (Maybe v)
+ Data.Aeson.Lens: traverseObject :: (FromJSON v, ToJSON v) => SimpleIndexedTraversal Text (Maybe Value) (Maybe v)
Files
- Data/Aeson/Lens.hs +44/−18
- aeson-lens.cabal +2/−2
Data/Aeson/Lens.hs view
@@ -6,15 +6,16 @@ module Data.Aeson.Lens ( -- * Lenses- nth,- key,+ nth, nth',+ key, key',+ asDouble, asText, asBool, -- * Traversals- traverseArray,- traverseObject,+ traverseArray, traverseArray',+ traverseObject, traverseObject' ) where import Control.Applicative@@ -35,9 +36,9 @@ data ValueIx = ArrIx Int | ObjIx T.Text -- | Lens of Value-valueAt :: (ToJSON v, FromJSON v)+valueAt :: (FromJSON u, ToJSON v) => ValueIx- -> SimpleIndexedLens ValueIx (Maybe Value) (Maybe v)+ -> IndexedLens ValueIx (Maybe Value) (Maybe Value) (Maybe u) (Maybe v) valueAt k = index $ \f (fmap toJSON -> v) -> go k v <$> f k (lu k v) where go (ObjIx ix) (Just (Object o)) Nothing = Just $ Object $ HMS.delete ix o go (ObjIx ix) (Just (Object o)) (Just v) = Just $ Object $ HMS.insert ix (toJSON v) o@@ -86,12 +87,19 @@ -- >>> let z = nth 0 .~ Just False $ y -- >>> L.unpack $ encode z -- "[false,\"hoge\"]"-nth :: (ToJSON v, FromJSON v)++nth :: (FromJSON v, ToJSON v) => Int -> SimpleIndexedLens ValueIx (Maybe Value) (Maybe v)-nth = valueAt . ArrIx+nth = nth' {-# INLINE nth #-} +nth' :: (FromJSON u, ToJSON v)+ => Int+ -> IndexedLens ValueIx (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)+nth' = valueAt . ArrIx+{-# INLINE nth' #-}+ -- | Lens of Object -- -- >>> let v = decode (L.pack "{\"foo\": {\"baz\": 3.14}, \"bar\": [123, false, null]}") :: Maybe Value@@ -109,12 +117,18 @@ -- >>> let x = key (T.pack "b") . key (T.pack "c") .~ Just True $ w -- >>> L.unpack $ encode x -- "{\"b\":{\"c\":true},\"a\":2.23}"-key :: (ToJSON v, FromJSON v)+key :: (FromJSON v, ToJSON v) => T.Text -> SimpleIndexedLens ValueIx (Maybe Value) (Maybe v)-key = valueAt . ObjIx+key = key' {-# INLINE key #-} +key' :: (FromJSON u, ToJSON v)+ => T.Text+ -> IndexedLens ValueIx (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)+key' = valueAt . ObjIx+{-# INLINE key' #-}+ -- | Indexed traversal of Array -- -- >>> let v = decode (L.pack "[1, true, null]") :: Maybe Value@@ -123,31 +137,43 @@ -- >>> let w = decode (L.pack "[{\"name\": \"tanakh\", \"age\": 29}, {\"name\": \"nushio\", \"age\": 28}]") :: Maybe Value -- >>> catMaybes . toListOf (traverseArray . key (T.pack "name")) $ w :: [T.Text] -- ["tanakh","nushio"]-traverseArray :: (ToJSON v, FromJSON v)+traverseArray :: (FromJSON v, ToJSON v) => SimpleIndexedTraversal Int (Maybe Value) (Maybe v)-traverseArray = index $ \f m -> case m of+traverseArray = traverseArray'+{-# INLINE traverseArray #-}++-- | Type-changing indexed traversal of an Array+traverseArray' :: (FromJSON u, ToJSON v)+ => IndexedTraversal Int (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)+traverseArray' = index $ \f m -> case m of Just (Array (map fromJSONMaybe . V.toList -> v)) ->- Just . Array . V.fromList . map toJSON . catMaybes <$> withIndex traverseList f v+ Just . Array . V.fromList . map toJSON . catMaybes <$> itraverse f v v -> pure v-{-# INLINE traverseArray #-}+{-# INLINE traverseArray' #-} -- | Indexed traversal of Object -- -- >>> let w = decode (L.pack "[{\"name\": \"tanakh\", \"age\": 29}, {\"name\": \"nushio\", \"age\": 28}]") :: Maybe Value -- >>> catMaybes . toListOf (traverseArray . traverseObject) $ w :: [Value] -- [String "tanakh",Number 29,String "nushio",Number 28]-traverseObject :: (ToJSON v, FromJSON v)+traverseObject :: (FromJSON v, ToJSON v) => SimpleIndexedTraversal T.Text (Maybe Value) (Maybe v)-traverseObject = index $ \f m -> case m of+traverseObject = traverseObject'+{-# INLINE traverseObject #-}++-- | Type-changing indexed traversal of Object+traverseObject' :: (FromJSON u, ToJSON v)+ => IndexedTraversal T.Text (Maybe Value) (Maybe Value) (Maybe u) (Maybe v)+traverseObject' = index $ \f m -> case m of Just (Object (expand . HMS.toList -> v)) -> Just . Object . HMS.fromList . catMaybes . collapse <$> withIndex traverseAssocList f v v -> pure v where expand = map (_2 %~ fromJSONMaybe) collapse = map (\(a, b) -> (a, ) . toJSON <$> b)-{-# INLINE traverseObject #-}+{-# INLINE traverseObject' #-} -traverseAssocList :: SimpleIndexedTraversal k [(k, v)] v+traverseAssocList :: IndexedTraversal k [(k, u)] [(k, v)] u v traverseAssocList = index $ \f m -> go f m where go _ [] = pure [] go f ((k, v): xs) = (\v' ys -> (k, v') : ys) <$> f k v <*> go f xs
aeson-lens.cabal view
@@ -1,5 +1,5 @@ name: aeson-lens-version: 0.3.0.0+version: 0.3.0.1 synopsis: Lens of Aeson description: Lens of Aeson license: BSD3@@ -19,7 +19,7 @@ exposed-modules: Data.Aeson.Lens build-depends: base >=4.5 && <5 , aeson >=0.6- , lens >=3.0+ , lens >=3.3 , text >=0.11 , bytestring >=0.9 , vector >=0.9