server: use insert-ordered-containers for ordered map

This commit is contained in:
Vamshi Surabhi 2018-06-28 13:49:27 +05:30
parent 3b8c5a1848
commit 47c73f750f
5 changed files with 45 additions and 99 deletions

View File

@ -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

View 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

View File

@ -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 |>

View File

@ -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

View File

@ -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