Replace Map with OrderedMap

This commit is contained in:
2021-02-19 08:09:04 +01:00
parent d74e27e903
commit 10e4d64052
6 changed files with 44 additions and 19 deletions

View File

@ -15,8 +15,10 @@ module Language.GraphQL.Execute.OrderedMap
, foldlWithKey'
, keys
, lookup
, replace
, singleton
, size
, toList
, traverseMaybe
) where
@ -49,8 +51,8 @@ instance Semigroup v => Semigroup (OrderedMap v) where
(<>) = foldlWithKey'
$ \accumulator key value -> insert key value accumulator
instance Monoid v => Monoid (OrderedMap v) where
mempty = OrderedMap mempty mempty
instance Semigroup v => Monoid (OrderedMap v) where
mempty = empty
instance Traversable OrderedMap where
traverse f (OrderedMap vector hashMap) = OrderedMap vector
@ -68,8 +70,8 @@ singleton key value = OrderedMap (Vector.singleton key)
$ HashMap.singleton key value
-- | Constructs an empty map.
empty :: Monoid v => OrderedMap v
empty = mempty
empty :: forall v. OrderedMap v
empty = OrderedMap mempty mempty
-- * Traversal
@ -90,7 +92,7 @@ foldlWithKey' f initial (OrderedMap vector hashMap) =
-- | Traverse over the elements and collect the 'Just' results.
traverseMaybe
:: (Applicative f, Monoid b)
:: Applicative f
=> forall a
. (a -> f (Maybe b))
-> OrderedMap a
@ -98,7 +100,7 @@ traverseMaybe
traverseMaybe f orderedMap = foldlWithKey' filter empty
<$> traverse f orderedMap
where
filter accumulator key (Just value) = insert key value accumulator
filter accumulator key (Just value) = replace key value accumulator
filter accumulator _ Nothing = accumulator
-- * Lists
@ -127,6 +129,16 @@ insert key value (OrderedMap vector hashMap)
| otherwise = OrderedMap (Vector.snoc vector key)
$ HashMap.insert key value hashMap
-- | Associates the specified value with the specified key in this map. If this
-- map previously contained a mapping for the key, the existing value is
-- replaced by the new one.
replace :: Text -> v -> OrderedMap v -> OrderedMap v
replace key value (OrderedMap vector hashMap)
| HashMap.member key hashMap = OrderedMap vector
$ HashMap.insert key value hashMap
| otherwise = OrderedMap (Vector.snoc vector key)
$ HashMap.insert key value hashMap
-- | Gives the size of this map, i.e. number of elements in it.
size :: forall v. OrderedMap v -> Int
size (OrderedMap vector _) = Vector.length vector