packages feed

aeson-t 0.0.3 → 0.0.4

raw patch · 2 files changed

+62/−50 lines, 2 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Data.Aeson.Transform: At :: Text -> Builder -> Builder
- Data.Aeson.Transform: AtIndex :: Int -> Builder -> Builder
- Data.Aeson.Transform: Attr :: Text -> Builder
- Data.Aeson.Transform: Id :: Builder
- Data.Aeson.Transform: Index :: Int -> Builder
- Data.Aeson.Transform: Keep :: [Text] -> Builder
- Data.Aeson.Transform: Map :: Builder -> Builder
- Data.Aeson.Transform: Merge :: Builder -> Builder -> Builder
- Data.Aeson.Transform: Obj :: (HashMap Text Builder) -> Builder
- Data.Aeson.Transform: data Builder
- Data.Aeson.Transform: transform :: Builder -> Value -> Value
+ Data.Aeson.Transform: at :: Text -> Builder -> Builder
+ Data.Aeson.Transform: atIndex :: Int -> Builder -> Builder
+ Data.Aeson.Transform: attr :: Text -> Builder
+ Data.Aeson.Transform: index :: Int -> Builder
+ Data.Aeson.Transform: keep :: [Text] -> Builder
+ Data.Aeson.Transform: map :: Builder -> Builder
+ Data.Aeson.Transform: merge :: Builder -> Builder -> Builder
+ Data.Aeson.Transform: obj :: HashMap Text Builder -> Builder
+ Data.Aeson.Transform: type Builder = Value -> Value

Files

Data/Aeson/Transform.hs view
@@ -3,10 +3,16 @@     -- * Example usage     -- $use -    -- * Transformation builder-    Builder(..)-    -- * Executing transformation-  , transform+    -- * Transformations+    Builder+  , at+  , attr+  , keep+  , Data.Aeson.Transform.map+  , Data.Aeson.Transform.index+  , atIndex+  , obj+  , merge   ) where  import Data.Aeson as A@@ -14,95 +20,101 @@ import qualified Data.Vector as Vec import qualified Data.HashMap.Strict as H --- | Transformations are specified by creating 'Builder' instances.--- Builders specify how to navigate through input JSON and construct--- output at various nodes in the tree.----data Builder =-    Id                  -- ^ Pass input directly as output-  | At Text Builder     -- ^ Move to value in current object-  | Attr Text           -- ^ Get value in current object-  | Keep [Text]         -- ^ Filter current object by keys-  | Map Builder         -- ^ Map over input array-  | Index Int           -- ^ Get value at index of current array-  | AtIndex Int Builder -- ^ Move to index in current array-  | Obj (H.HashMap Text Builder) -- ^ Produce object with given keys-  | Merge Builder Builder  -- ^ Combine two objects+type Builder = Value -> Value +-- | Move to value in current object+at :: Text -> Builder -> Builder+at k b (A.Object o) = b (o H.! k)+at _ _ _ = error "Expecting object (at)" --- | Generates new Aeson 'Value' guided by a 'Builder'----transform :: Builder -> Value       -> Value-transform Id            x            = x-transform (At k b)      (A.Object o) = transform b $ o H.! k-transform (At _ _)      _            = error "Expecting object (At)"-transform (AtIndex i b) (Array a)    = transform b $ a Vec.! i-transform (AtIndex _ _) _            = error "Expecting array (AtIndex)"-transform (Index i)     (Array a)    = a Vec.! i-transform (Index _)     _            = error "Expecting array (Index)"-transform (Map b)       (Array a)    = Array $ Vec.map (transform b) a-transform (Map _)       _            = error "Expecting array (Map)"-transform (Attr k)      (A.Object o) = o H.! k-transform (Attr _)      _            = error "Expecting object (Keep)"-transform (Keep ks)     (A.Object o) = A.Object $ H.filterWithKey (const . (`elem` ks)) o-transform (Keep _)      _            = error "Expecting object (Keep)"-transform (Obj fs)      x            = A.Object $ H.map (`transform` x) fs-transform (Merge a b)   x            = case (transform a x, transform b x) of-                                       (Object c, Object d) -> Object $ H.union c d-                                       _ -> error "Expected two objects (Merge)"+-- | Get value in current object+attr :: Text -> Builder+attr k (A.Object o) = o H.! k+attr _ _ = error "Expecting object (attr)" +-- | Filter current object by keys+keep :: [Text] -> Builder+keep ks (A.Object o) = A.Object $ H.filterWithKey (const . (`elem` ks)) o+keep _ _ = error "Expecting object (keep)"++-- | Map over input array+map :: Builder -> Builder+map b (Array a) = Array $ Vec.map b a+map _ _ = error "Expecting array (map)"++-- | Get value at index of current array+index :: Int -> Builder+index i (Array a) = a Vec.! i+index _ _ = error "Expecting array (index)"++-- | Move to index in current array+atIndex :: Int -> Builder -> Builder+atIndex i b (Array a) = b $ a Vec.! i+atIndex _ _ _ = error "Expecting array (atIndex)"++-- | Produce object with given keys+obj :: H.HashMap Text Builder -> Builder+obj h x = A.Object $ H.map (\b -> b x) h++-- | Combine two objects+merge :: Builder -> Builder -> Builder+merge a b val = case (a val, b val) of+                  (Object c, Object d) -> Object $ H.union c d+                  _ -> error "Expected two objects (merge)"++ -- $use -- -- Filter unwanted attributes from an object ----- > Keep ["nice", "good"]+-- > keep ["nice", "good"] -- > -- > -- { bad: 3, good: 1, nice: 500, evil: -3 } -- > -- => { good: 1, nice: 500 } -- -- Grab value ----- > Attr "foo"+-- > attr "foo" -- > -- > -- { foo: 2 } => 2 -- -- Dig deeper ----- > At "foo" $ Attr "bar"+-- > at "foo" $ attr "bar" -- > -- > -- { foo: { bar: 3 }} => 3 -- -- Map stuff ----- > Map $ Attr "foo"+-- > map $ attr "foo" -- > -- > -- [{ foo:1 }, { foo:2 }] => [1, 2] -- -- Extract indices ----- > Map $ Index 0+-- > map $ index 0 -- > -- > -- [[1,2], [3,4]] => [1, 3] -- -- Create object ----- > Obj $ fromList [--- >     ("first", Index 0)--- >   , ("second", Index 1)+-- > obj $ fromList [+-- >     ("first", index 0)+-- >   , ("second", index 1) -- >   ] -- > -- > -- ["hi", "bye"] => { first:"hi", second:"bye" } -- -- Transform position ----- > At "ranks" $ AtIndex 0 $ Attr "name"+-- > at "ranks" $ atIndex 0 $ attr "name" -- >--- > -- {ranks: [ { name:"winner", score:12 }, { name:"Loser", score: 3 ]}+-- > -- {ranks: [ { name:"winner", score:12 }, { name:"loser", score: 3 ]} -- > -- => "winner" -- -- Combine objects ----- > Merge (Attr "foo") (Attr "bar")+-- > merge (attr "foo") (attr "bar") -- > -- > -- { foo: { a:1, b:2 }, bar: { b:3, c:4 } } -- > -- => { a:1, b:2, c:4 }
aeson-t.cabal view
@@ -1,5 +1,5 @@ Name:                   aeson-t-Version:                0.0.3+Version:                0.0.4 Author:                 Joe Nelson <cred+github@begriffs.com> Maintainer:             Joe Nelson <cred+github@begriffs.com> Category:               Data