aboutsummaryrefslogtreecommitdiffstats
path: root/src/Data/JLD/Util.hs
diff options
context:
space:
mode:
authorVolpeon <github@volpeon.ink>2023-05-26 07:40:13 +0200
committerVolpeon <github@volpeon.ink>2023-05-26 07:40:13 +0200
commit11d0fb47c292a0ca25a9c377499d2b221d97a5cb (patch)
treee729e2a4508763b3073b7eae9a56bc9c6a9ca0f7 /src/Data/JLD/Util.hs
downloadhs-jsonld-11d0fb47c292a0ca25a9c377499d2b221d97a5cb.tar.gz
hs-jsonld-11d0fb47c292a0ca25a9c377499d2b221d97a5cb.tar.bz2
hs-jsonld-11d0fb47c292a0ca25a9c377499d2b221d97a5cb.zip
Init
Diffstat (limited to 'src/Data/JLD/Util.hs')
-rw-r--r--src/Data/JLD/Util.hs118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/Data/JLD/Util.hs b/src/Data/JLD/Util.hs
new file mode 100644
index 0000000..82cbdee
--- /dev/null
+++ b/src/Data/JLD/Util.hs
@@ -0,0 +1,118 @@
1module Data.JLD.Util (
2 valueContains,
3 valueContainsAny,
4 valueIsTrue,
5 valueIsString,
6 valueIsArray,
7 valueIsNotArray,
8 valueIsEmptyArray,
9 valueIsScalar,
10 valueToString,
11 valueIsNotString,
12 valueIsNotNull,
13 flattenSingletonArray,
14 valueToArray,
15 allStrings,
16 ifindM,
17 getMapDefault,
18 mapAddValue,
19) where
20
21import Data.JLD.Prelude
22
23import Data.Aeson (Array, Key, Object, Value (..))
24import Data.Aeson.Key qualified as K (fromText)
25import Data.Aeson.KeyMap qualified as KM (insert, lookup, member)
26import Data.Foldable qualified as F (Foldable (..), elem)
27import Data.Foldable.WithIndex (FoldableWithIndex (..), ifoldlM)
28import Data.Vector (Vector)
29import Data.Vector qualified as V (fromList, null, singleton, snoc, uncons)
30
31valueContains :: Text -> Value -> Bool
32valueContains text = \case
33 String s -> s == text
34 Array a -> elem (String text) a
35 Object o -> KM.member (K.fromText text) o
36 _ -> False
37
38valueContainsAny :: (Foldable f, Functor f) => f Text -> Value -> Bool
39valueContainsAny texts = \case
40 String s -> s `F.elem` texts
41 Array a -> any (`elem` a) <| String <$> texts
42 Object o -> any (\text -> KM.member (K.fromText text) o) texts
43 _ -> False
44
45valueIsTrue :: Value -> Bool
46valueIsTrue (Bool True) = True
47valueIsTrue _ = False
48
49valueIsString :: Value -> Bool
50valueIsString (String _) = True
51valueIsString _ = False
52
53valueIsNotString :: Value -> Bool
54valueIsNotString = valueIsString .> not
55
56valueIsArray :: Value -> Bool
57valueIsArray (Array _) = True
58valueIsArray _ = False
59
60valueIsNotArray :: Value -> Bool
61valueIsNotArray = valueIsArray .> not
62
63valueIsEmptyArray :: Value -> Bool
64valueIsEmptyArray (Array a) = V.null a
65valueIsEmptyArray _ = False
66
67valueIsScalar :: Value -> Bool
68valueIsScalar = \case
69 String _ -> True
70 Number _ -> True
71 Bool _ -> True
72 _ -> False
73
74valueToString :: Value -> Maybe Text
75valueToString (String s) = Just s
76valueToString _ = Nothing
77
78valueIsNotNull :: Value -> Bool
79valueIsNotNull Null = False
80valueIsNotNull _ = True
81
82flattenSingletonArray :: Value -> Value
83flattenSingletonArray = \case
84 Array (V.uncons -> Just (value, V.null -> True)) -> value
85 value -> value
86
87valueToArray :: Value -> Array
88valueToArray = \case
89 Array a -> a
90 value -> V.singleton value
91
92allStrings :: Array -> Maybe (Vector Text)
93allStrings = foldl' go (Just mempty)
94 where
95 go :: Maybe (Vector Text) -> Value -> Maybe (Vector Text)
96 go (Just a) (String s) = Just <| V.snoc a s
97 go _ _ = Nothing
98
99ifindM :: (FoldableWithIndex i f, Monad m) => (i -> a -> m Bool) -> f a -> m (Maybe a)
100ifindM p = ifoldlM (\i r x -> p i x <&> bool r (Just x)) Nothing
101
102getMapDefault :: Key -> Object -> Object
103getMapDefault key obj = case KM.lookup key obj of
104 Just (Object o) -> o
105 _ -> mempty
106
107mapAddValue :: Key -> Value -> Bool -> Object -> Object
108mapAddValue key value True object = mapAddValue key value False <| KM.insert key (Array array) object
109 where
110 array = case KM.lookup key object of
111 Just (Array a) -> a
112 Just original -> V.singleton original
113 Nothing -> mempty
114mapAddValue key (Array value) False object = foldl' (\o v -> mapAddValue key v False o) object value
115mapAddValue key value False object = case KM.lookup key object of
116 Just (Array a) -> KM.insert key (Array <| V.snoc a value) object
117 Just original -> KM.insert key (Array <| V.fromList [original, value]) object
118 Nothing -> KM.insert key value object