mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-09-20 23:17:30 +03:00
server: use insert-ordered-containers for ordered map
This commit is contained in:
parent
3b8c5a1848
commit
47c73f750f
@ -89,6 +89,9 @@ library
|
||||
, http-client-tls
|
||||
, connection
|
||||
|
||||
-- ordered map
|
||||
, insert-ordered-containers
|
||||
|
||||
--
|
||||
, data-has
|
||||
|
||||
@ -128,8 +131,6 @@ library
|
||||
, Hasura.GraphQL.Execute
|
||||
, Hasura.GraphQL.Execute.Result
|
||||
, Hasura.GraphQL.Schema
|
||||
, Hasura.GraphQL.OrderedMap
|
||||
, Hasura.GraphQL.NonEmptySeq
|
||||
, Hasura.GraphQL.Utils
|
||||
, Hasura.GraphQL.Validate.Types
|
||||
, Hasura.GraphQL.Validate.Context
|
||||
@ -143,6 +144,8 @@ library
|
||||
, Hasura.GraphQL.Resolve.Select
|
||||
|
||||
, Data.Text.Extended
|
||||
, Data.Sequence.NonEmpty
|
||||
, Data.HashMap.Strict.InsOrd.Extended
|
||||
|
||||
, Hasura.SQL.DML
|
||||
, Hasura.SQL.Types
|
||||
|
28
server/src-lib/Data/HashMap/Strict/InsOrd/Extended.hs
Normal file
28
server/src-lib/Data/HashMap/Strict/InsOrd/Extended.hs
Normal file
@ -0,0 +1,28 @@
|
||||
module Data.HashMap.Strict.InsOrd.Extended
|
||||
( OMap.elems
|
||||
, groupTuples
|
||||
, groupListWith
|
||||
) where
|
||||
|
||||
import qualified Data.HashMap.Strict.InsOrd as OMap
|
||||
import qualified Data.Sequence.NonEmpty as NE
|
||||
|
||||
import Data.Hashable (Hashable)
|
||||
import Data.List (foldl')
|
||||
|
||||
import Prelude (Eq, Foldable, Functor, fmap, ($))
|
||||
|
||||
groupTuples
|
||||
:: (Eq k, Hashable k, Foldable t)
|
||||
=> t (k, v) -> OMap.InsOrdHashMap k (NE.NESeq v)
|
||||
groupTuples =
|
||||
foldl' groupFlds OMap.empty
|
||||
where
|
||||
groupFlds m (k, v) =
|
||||
OMap.insertWith (\_ c -> c NE.|> v) k (NE.init v) m
|
||||
|
||||
groupListWith
|
||||
:: (Eq k, Hashable k, Foldable t, Functor t)
|
||||
=> (v -> k) -> t v -> OMap.InsOrdHashMap k (NE.NESeq v)
|
||||
groupListWith f l =
|
||||
groupTuples $ fmap (\v -> (f v, v)) l
|
@ -1,6 +1,4 @@
|
||||
{-# LANGUAGE NoImplicitPrelude #-}
|
||||
|
||||
module Hasura.GraphQL.NonEmptySeq
|
||||
module Data.Sequence.NonEmpty
|
||||
( NESeq
|
||||
, (<|)
|
||||
, (|>)
|
||||
@ -10,7 +8,7 @@ module Hasura.GraphQL.NonEmptySeq
|
||||
) where
|
||||
|
||||
import qualified Data.Sequence as Seq
|
||||
import Hasura.Prelude hiding (head)
|
||||
import Prelude (Eq, Show, fst, (.))
|
||||
|
||||
infixr 5 <|
|
||||
infixl 5 |>
|
@ -1,83 +0,0 @@
|
||||
{-# LANGUAGE NoImplicitPrelude #-}
|
||||
|
||||
-- TODO: use insert-ordered-containers
|
||||
|
||||
module Hasura.GraphQL.OrderedMap
|
||||
( empty
|
||||
, elems
|
||||
, insert
|
||||
, lookup
|
||||
, toList
|
||||
, OMap
|
||||
, groupTuples
|
||||
, groupListWith
|
||||
) where
|
||||
|
||||
import qualified Data.HashMap.Strict as Map
|
||||
import Hasura.Prelude hiding (toList)
|
||||
|
||||
import qualified Hasura.GraphQL.NonEmptySeq as NE
|
||||
|
||||
newtype OVal v =
|
||||
OVal { _unOVal :: (Int, v) }
|
||||
deriving (Show)
|
||||
|
||||
getI :: OVal v -> Int
|
||||
getI = fst . _unOVal
|
||||
|
||||
getV :: OVal v -> v
|
||||
getV = snd . _unOVal
|
||||
|
||||
setV :: (v -> v) -> OVal v -> OVal v
|
||||
setV f (OVal (i, v)) = OVal (i, f v)
|
||||
|
||||
newtype OMap k v =
|
||||
OMap { _unOMap :: (Int, Map.HashMap k (OVal v)) }
|
||||
deriving (Show)
|
||||
|
||||
empty :: OMap k v
|
||||
empty = OMap (0, Map.empty)
|
||||
|
||||
insert :: (Eq k, Hashable k) => k -> v -> OMap k v -> OMap k v
|
||||
insert k v (OMap (index, m)) =
|
||||
OMap (index + 1, Map.insert k (OVal (index, v)) m)
|
||||
|
||||
insertWith
|
||||
:: (Eq k, Hashable k)
|
||||
=> (Maybe v -> v) -> k -> OMap k v -> OMap k v
|
||||
insertWith f k oMap@(OMap (index, m)) =
|
||||
case Map.lookup k m of
|
||||
Just ov ->
|
||||
let newVal = setV (f . Just) ov
|
||||
in OMap (index, Map.insert k newVal m)
|
||||
Nothing ->
|
||||
insert k (f Nothing) oMap
|
||||
|
||||
toList :: OMap k v -> [(k, v)]
|
||||
toList (OMap (_, m)) =
|
||||
[ (k, getV ov) | (k, ov) <- orderedList]
|
||||
where
|
||||
orderedList =
|
||||
sortBy (comparing (getI . snd)) $ Map.toList m
|
||||
|
||||
elems :: OMap k v -> [v]
|
||||
elems = map snd . toList
|
||||
|
||||
lookup :: (Hashable k, Eq k) => k -> OMap k a -> Maybe a
|
||||
lookup k (OMap (_, m)) =
|
||||
getV <$> Map.lookup k m
|
||||
|
||||
groupTuples
|
||||
:: (Eq k, Hashable k, Foldable t)
|
||||
=> t (k, v) -> OMap k (NE.NESeq v)
|
||||
groupTuples =
|
||||
foldl' groupFlds empty
|
||||
where
|
||||
groupFlds m (k, v) =
|
||||
insertWith ( maybe (NE.init v) (NE.|> v) ) k m
|
||||
|
||||
groupListWith
|
||||
:: (Eq k, Hashable k, Foldable t, Functor t)
|
||||
=> (v -> k) -> t v -> OMap k (NE.NESeq v)
|
||||
groupListWith f l =
|
||||
groupTuples $ fmap (\v -> (f v, v)) l
|
@ -12,16 +12,16 @@ module Hasura.GraphQL.Validate.Field
|
||||
|
||||
import Hasura.Prelude
|
||||
|
||||
import qualified Data.Aeson as J
|
||||
import qualified Data.Aeson.Casing as J
|
||||
import qualified Data.Aeson.TH as J
|
||||
import qualified Data.HashMap.Strict as Map
|
||||
import qualified Data.List as L
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Data.Text as T
|
||||
import qualified Hasura.GraphQL.NonEmptySeq as NE
|
||||
import qualified Hasura.GraphQL.OrderedMap as OMap
|
||||
import qualified Language.GraphQL.Draft.Syntax as G
|
||||
import qualified Data.Aeson as J
|
||||
import qualified Data.Aeson.Casing as J
|
||||
import qualified Data.Aeson.TH as J
|
||||
import qualified Data.HashMap.Strict as Map
|
||||
import qualified Data.HashMap.Strict.InsOrd.Extended as OMap
|
||||
import qualified Data.List as L
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Data.Sequence.NonEmpty as NE
|
||||
import qualified Data.Text as T
|
||||
import qualified Language.GraphQL.Draft.Syntax as G
|
||||
|
||||
import Hasura.GraphQL.Validate.Context
|
||||
import Hasura.GraphQL.Validate.InputValue
|
||||
|
Loading…
Reference in New Issue
Block a user