aeson-helper 0.1.0.0 → 0.2.0.0
raw patch · 2 files changed
+54/−21 lines, 2 filesdep −unordered-containersdep ~aesonPVP ok
version bump matches the API change (PVP)
Dependencies removed: unordered-containers
Dependency ranges changed: aeson
API changes (from Hackage documentation)
- Data.Aeson.Helper: replace :: Text -> Text -> Value -> Value
+ Data.Aeson.Helper: replace :: Key -> Key -> Value -> Value
Files
- aeson-helper.cabal +2/−3
- src/Data/Aeson/Helper.hs +52/−18
aeson-helper.cabal view
@@ -1,5 +1,5 @@ name: aeson-helper-version: 0.1.0.0+version: 0.2.0.0 synopsis: Aeson helper func description: Aeson helper func: replace union difference pick homepage: https://github.com/Lupino/yuntan-common/tree/master/aeson-helper#readme@@ -18,9 +18,8 @@ exposed-modules: Data.Aeson.Helper build-depends: base >= 4.7 && < 5- , unordered-containers , text- , aeson+ , aeson >= 2.0 , vector default-language: Haskell2010
src/Data/Aeson/Helper.hs view
@@ -7,48 +7,82 @@ , pick ) where -import Data.Aeson (Value (..))-import Data.Maybe (catMaybes)-import Data.Text (Text)-import qualified Data.Text as T (isPrefixOf, stripPrefix)-import qualified Data.Vector as V (map)--import Data.HashMap.Strict (delete, insert, lookupDefault,- mapMaybeWithKey)-import qualified Data.HashMap.Strict as HM (difference, union)+import Data.Aeson (Value (..))+import Data.Aeson.Key (Key, toText)+import qualified Data.Aeson.KeyMap as KeyMap (delete, difference, insert,+ lookup, mapMaybeWithKey, union)+import Data.Maybe (catMaybes, fromMaybe)+import Data.Text (Text)+import qualified Data.Text as T (isPrefixOf, stripPrefix)+import qualified Data.Vector as V (map) -replace :: Text -> Text -> Value -> Value-replace okey nkey (Object v) = Object . insert nkey ov $ delete okey v- where ov = lookupDefault Null okey v+-- | Replace JSON key to a new key+--+-- >>> replace "okey" "nkey" (object [ "okey" := "value" ])+-- Object (fromList [("nkey",String "value")])+--+-- >>> replace "okey" "nkey" (String "value")+-- String "value"+replace :: Key -> Key -> Value -> Value+replace okey nkey (Object v) = Object . KeyMap.insert nkey ov $ KeyMap.delete okey v+ where ov = fromMaybe Null $ KeyMap.lookup okey v replace _ _ v = v +-- | Union two JSON+--+-- >>> union (object ["key1" .= "value1"]) (object ["key2" .= "value2"])+-- Object (fromList [("key2",String "value2"),("key1",String "value1")])+--+-- >>> union (object ["key1" .= "value1"]) (object ["key1" .= "value2"])+-- Object (fromList [("key1",String "value1")])+--+-- >>> union Null (object ["key2" .= "value2"])+-- Object (fromList [("key2",String "value2")])+--+-- >>> union (object ["key1" .= "value1"]) Null+-- Object (fromList [("key1",String "value1")]) union :: Value -> Value -> Value-union (Object a) (Object b) = Object $ HM.union a b+union (Object a) (Object b) = Object $ KeyMap.union a b union (Object a) _ = Object a union _ (Object b) = Object b union _ _ = Null +-- | Difference two JSON+--+-- >>> difference (object ["key1" .= "value1", "key2" .= "value2"]) (object ["key1" .= Null])+-- Object (fromList [("key2",String "value2")]) difference :: Value -> Value -> Value-difference (Object a) (Object b) = Object $ HM.difference a b+difference (Object a) (Object b) = Object $ KeyMap.difference a b difference (Object a) _ = Object a difference _ _ = Null --- key1.key2.key3+-- | Pick a value from JSON+--+-- >>> pick ["key1"] $ object ["key1" .= "value1", "key2" .= "value2", "key3" .= "value3"]+-- Object (fromList [("key1",String "value1")])+--+-- >>> pick ["key1", "key2"] $ object ["key1" .= "value1", "key2" .= "value2", "key3" .= "value3"]+-- Object (fromList [("key2",String "value2"),("key1",String "value1")])+--+-- >>> pick ["key3.key4"] $ object ["key1" .= "value1", "key2" .= "value2", "key3" .= object ["key4" .= "value4"]]+-- Object (fromList [("key3",Object (fromList [("key4",String "value4")]))]) pick :: [Text] -> Value -> Value pick [] v = v-pick ks (Object a) = Object $ mapMaybeWithKey (doMapMaybeWithKey ks) a+pick ks (Object a) = Object $ KeyMap.mapMaybeWithKey (doMapMaybeWithKey ks) a pick ks (Array a) = Array $ V.map (pick ks) a pick _ _ = Null -doMapMaybeWithKey :: [Text] -> Text -> Value -> Maybe Value-doMapMaybeWithKey ks k v = go ks+doMapMaybeWithKey :: [Text] -> Key -> Value -> Maybe Value+doMapMaybeWithKey ks key v = go ks where go :: [Text] -> Maybe Value go [] = Nothing go (x:xs) | k == x = Just v | (k <> "." ) `T.isPrefixOf` x = Just $ pick (catMaybes $ nextKeys ks k) v | otherwise = go xs++ k = toText key nextKeys :: [Text] -> Text -> [Maybe Text] nextKeys [] _ = []