{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.Types.SelectionTree where
import Data.Morpheus.Internal.Utils (elems, keyOf)
import Data.Morpheus.Types.Internal.AST
( FieldName (..),
Selection (..),
Selection (selectionContent),
SelectionContent (SelectionField, SelectionSet, UnionSelection),
UnionTag (..),
VALID,
)
import Data.Text (unpack)
import Relude
class SelectionTree nodeType where
isLeaf :: nodeType -> Bool
getChildrenList :: nodeType -> [nodeType]
getName :: IsString name => nodeType -> name
instance SelectionTree (Selection VALID) where
isLeaf :: Selection VALID -> Bool
isLeaf Selection VALID
node = case Selection VALID -> SelectionContent VALID
forall (s :: Stage). Selection s -> SelectionContent s
selectionContent Selection VALID
node of
SelectionContent VALID
SelectionField -> Bool
True
SelectionContent VALID
_ -> Bool
False
getChildrenList :: Selection VALID -> [Selection VALID]
getChildrenList Selection VALID
node = case Selection VALID -> SelectionContent VALID
forall (s :: Stage). Selection s -> SelectionContent s
selectionContent Selection VALID
node of
SelectionContent VALID
SelectionField -> [Selection VALID]
forall a. Monoid a => a
mempty
(SelectionSet SelectionSet VALID
deeperSel) -> SelectionSet VALID -> [Selection VALID]
forall a coll. Elems a coll => coll -> [a]
elems SelectionSet VALID
deeperSel
(UnionSelection UnionSelection VALID
sel) ->
(UnionTag -> [Selection VALID]) -> [UnionTag] -> [Selection VALID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap
(SelectionSet VALID -> [Selection VALID]
forall a coll. Elems a coll => coll -> [a]
elems (SelectionSet VALID -> [Selection VALID])
-> (UnionTag -> SelectionSet VALID)
-> UnionTag
-> [Selection VALID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnionTag -> SelectionSet VALID
unionTagSelection)
(UnionSelection VALID -> [UnionTag]
forall a coll. Elems a coll => coll -> [a]
elems UnionSelection VALID
sel)
getName :: Selection VALID -> name
getName =
String -> name
forall a. IsString a => String -> a
fromString
(String -> name)
-> (Selection VALID -> String) -> Selection VALID -> name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack
(Text -> String)
-> (Selection VALID -> Text) -> Selection VALID -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldName -> Text
readName
(FieldName -> Text)
-> (Selection VALID -> FieldName) -> Selection VALID -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Selection VALID -> FieldName
forall k a. KeyOf k a => a -> k
keyOf