{-# OPTIONS_GHC -Wno-orphans #-}

module Miso.GraphQL.Printer where

import Data.Bool (bool)
import Data.Foldable (Foldable (toList))
import Data.List.NonEmpty (NonEmpty)
import Data.Maybe (catMaybes)
import Miso.GraphQL.AST
import Miso.Prelude hiding (enclosed, lex, unwords)
import Miso.String (ToMisoString, intercalate, unwords)

withDesc :: Maybe Description -> MisoString -> MisoString
withDesc :: Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
Nothing = MisoString -> MisoString
forall a. a -> a
id
withDesc (Just Description
desc) = ((Description -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Description
desc MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
"\n") MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<>)

enclosed :: MisoString -> MisoString -> MisoString -> MisoString
enclosed :: MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
a MisoString
b MisoString
c = MisoString
a MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
c MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
b

unwords' :: (Foldable f, ToMisoString a) => f a -> MisoString
unwords' :: forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords' f a
xs = [MisoString] -> MisoString
unwords ([MisoString] -> MisoString) -> [MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ a -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (a -> MisoString) -> [a] -> [MisoString]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f a -> [a]
forall a. f a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList f a
xs

-- | https://spec.graphql.org/draft/#Document
instance ToMisoString Document where
    toMisoString :: Document -> MisoString
toMisoString (Document NonEmpty Definition
definitions) = NonEmpty Definition -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords' NonEmpty Definition
definitions

-- | https://spec.graphql.org/draft/#Definition
instance ToMisoString Definition where
    toMisoString :: Definition -> MisoString
toMisoString (DefinitionExecutable ExecutableDefinition
s) = ExecutableDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ExecutableDefinition
s
    toMisoString (DefinitionTypeSystem TypeSystemDefinition
s) = TypeSystemDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString TypeSystemDefinition
s
    toMisoString (ExtensionTypeSystem TypeSystemExtension
s) = TypeSystemExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString TypeSystemExtension
s

-- https://spec.graphql.org/draft/#ExecutableDefinition
instance ToMisoString ExecutableDefinition where
    toMisoString :: ExecutableDefinition -> MisoString
toMisoString (DefinitionOperation OperationDefinition
s) = OperationDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString OperationDefinition
s
    toMisoString (DefinitionFragment FragmentDefinition
s) = FragmentDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString FragmentDefinition
s

-- | A GraphQL 'OperationDefinition'
-- https://spec.graphql.org/draft/#OperationDefinition
instance ToMisoString OperationDefinition where
    toMisoString :: OperationDefinition -> MisoString
toMisoString (AnonymousQuery SelectionSet
selectionSet) = SelectionSet -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString SelectionSet
selectionSet
    toMisoString (OperationDefinition Maybe Description
desc OperationType
ot Maybe Name
name Maybe VariablesDefinition
vars Maybe Directives
dirs SelectionSet
selectionSet) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ OperationType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString OperationType
ot
              , Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Name -> MisoString) -> Maybe Name -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Name
name
              , VariablesDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (VariablesDefinition -> MisoString)
-> Maybe VariablesDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe VariablesDefinition
vars
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
dirs
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ SelectionSet -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString SelectionSet
selectionSet
              ]

-- | A GraphQL 'Operation' type
-- https://spec.graphql.org/draft/#OperationType
instance ToMisoString OperationType where
    toMisoString :: OperationType -> MisoString
toMisoString OperationType
Query = MisoString
"query"
    toMisoString OperationType
Mutation = MisoString
"mutation"
    toMisoString OperationType
Subscription = MisoString
"subscription"

-- | A GraphQL 'SelectionSet'
-- https://spec.graphql.org/draft/#SelectionSet
instance ToMisoString (NonEmpty Selection) where
    toMisoString :: SelectionSet -> MisoString
toMisoString = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"{" MisoString
"}" (MisoString -> MisoString)
-> (SelectionSet -> MisoString) -> SelectionSet -> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. SelectionSet -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords'

-- | A GraphQL 'Selection' type
-- https://spec.graphql.org/draft/#Selection
instance ToMisoString Selection where
    toMisoString :: Selection -> MisoString
toMisoString (SelectionField Field
field) = Field -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Field
field
    toMisoString (SelectionFragmentSpread FragmentSpread
fragmentSpread) = FragmentSpread -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString FragmentSpread
fragmentSpread
    toMisoString (SelectionInlineFragment InlineFragment
inlineFragment) = InlineFragment -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString InlineFragment
inlineFragment

-- | A GraphQL 'Field' type
-- https://spec.graphql.org/draft/#Field
instance ToMisoString Field where
    toMisoString :: Field -> MisoString
toMisoString (Field Maybe Alias
alias Name
name Maybe Arguments
args Maybe Directives
dirs Maybe SelectionSet
selectionSet) =
        [MisoString] -> MisoString
forall a. Monoid a => [a] -> a
mconcat
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ Alias -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Alias -> MisoString) -> Maybe Alias -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Alias
alias
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Arguments -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Arguments -> MisoString) -> Maybe Arguments -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Arguments
args
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
dirs
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Maybe SelectionSet -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Maybe SelectionSet
selectionSet
              ]

-- | A GraphQL 'Alias'
-- https://spec.graphql.org/draft/#Alias
instance ToMisoString Alias where
    toMisoString :: Alias -> MisoString
toMisoString (Alias Name
name) = Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
":"

-- | GraphQL 'Arguments'
-- https://spec.graphql.org/draft/#Arguments
instance ToMisoString Arguments where
    toMisoString :: Arguments -> MisoString
toMisoString = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"(" MisoString
")" (MisoString -> MisoString)
-> (Arguments -> MisoString) -> Arguments -> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Arguments -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords'

-- | A GraphQL 'Argument'
-- https://spec.graphql.org/draft/#Arguments
instance ToMisoString Argument where
    toMisoString :: Argument -> MisoString
toMisoString (Argument Name
name Value
value) = Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
":" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> Value -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Value
value

-- | GraphQL 'FragmentSpread' type
-- https://spec.graphql.org/draft/#FragmentSpread
instance ToMisoString FragmentSpread where
    toMisoString :: FragmentSpread -> MisoString
toMisoString (FragmentSpread FragmentName
fragmentName Maybe Directives
directives) =
        [MisoString] -> MisoString
unwords [MisoString
"...", FragmentName -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString FragmentName
fragmentName, MisoString
-> (Directives -> MisoString) -> Maybe Directives -> MisoString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe MisoString
"" Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Maybe Directives
directives]

-- | GraphQL 'InlineFragment' type
-- https://spec.graphql.org/draft/#InlineFragment
instance ToMisoString InlineFragment where
    toMisoString :: InlineFragment -> MisoString
toMisoString (InlineFragment Maybe TypeCondition
typeCondition Maybe Directives
directives SelectionSet
selectionSet) =
        [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"..."
              , TypeCondition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (TypeCondition -> MisoString)
-> Maybe TypeCondition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe TypeCondition
typeCondition
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ SelectionSet -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString SelectionSet
selectionSet
              ]

-- | A GraphQL 'FragmentDefinition'
-- https://spec.graphql.org/draft/#FragmentDefinition
instance ToMisoString FragmentDefinition where
    toMisoString :: FragmentDefinition -> MisoString
toMisoString (FragmentDefinition Maybe Description
desc FragmentName
fragmentName TypeCondition
typeCondition Maybe Directives
directives SelectionSet
selectionSet) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"fragment"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ FragmentName -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString FragmentName
fragmentName
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ TypeCondition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString TypeCondition
typeCondition
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ SelectionSet -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString SelectionSet
selectionSet
              ]

-- | A GraphQL 'FragmentName'
-- https://spec.graphql.org/draft/#FragmentName
instance ToMisoString FragmentName where
    toMisoString :: FragmentName -> MisoString
toMisoString (FragmentName Name
name) = Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name

-- | A GraphQL 'TypeCondition'
-- https://spec.graphql.org/draft/#TypeCondition
instance ToMisoString TypeCondition where
    toMisoString :: TypeCondition -> MisoString
toMisoString (TypeCondition NamedType
namedType) = MisoString
"on " MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> NamedType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString NamedType
namedType

-- | A GraphQL 'Value'
-- https://spec.graphql.org/draft/#Value
instance ToMisoString Value where
    toMisoString :: Value -> MisoString
toMisoString (ValueVariable Variable
variable) = Variable -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Variable
variable
    toMisoString (ValueInt Int
i) = String -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (String -> MisoString) -> (Int -> String) -> Int -> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> String
forall a. Show a => a -> String
show (Int -> MisoString) -> Int -> MisoString
forall a b. (a -> b) -> a -> b
$ Int
i
    toMisoString (ValueFloat Double
f) = String -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (String -> MisoString)
-> (Double -> String) -> Double -> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Double -> String
forall a. Show a => a -> String
show (Double -> MisoString) -> Double -> MisoString
forall a b. (a -> b) -> a -> b
$ Double
f
    toMisoString (ValueString StringValue
s) = StringValue -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString StringValue
s
    toMisoString (ValueBoolean Bool
True) = MisoString
"true"
    toMisoString (ValueBoolean Bool
False) = MisoString
"false"
    toMisoString Value
ValueNull = MisoString
"null"
    toMisoString (ValueEnum EnumValue
enumValue) = EnumValue -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString EnumValue
enumValue
    toMisoString (ValueList [Value]
listValue) = [Value] -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString [Value]
listValue
    toMisoString (ValueObject [ObjectField]
objectValue) = [ObjectField] -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString [ObjectField]
objectValue

-- | https://spec.graphql.org/draft/#StringValue
instance ToMisoString StringValue where
    toMisoString :: StringValue -> MisoString
toMisoString (BlockString MisoString
s) = MisoString
"\"\"\"" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
s MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
"\"\"\""
    toMisoString (SingleLineString MisoString
s) = MisoString
"\"" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
s MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
"\""

-- | https://spec.graphql.org/draft/#ListValue
instance ToMisoString [Value] where
    toMisoString :: [Value] -> MisoString
toMisoString = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"[" MisoString
"]" (MisoString -> MisoString)
-> ([Value] -> MisoString) -> [Value] -> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Value] -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords'

-- | https://spec.graphql.org/draft/#ObjectValue
instance ToMisoString [ObjectField] where
    toMisoString :: [ObjectField] -> MisoString
toMisoString = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"{" MisoString
"}" (MisoString -> MisoString)
-> ([ObjectField] -> MisoString) -> [ObjectField] -> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [ObjectField] -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords'

-- | A GraphQL 'EnumValue'
-- https://spec.graphql.org/draft/#EnumValue
instance ToMisoString EnumValue where
    toMisoString :: EnumValue -> MisoString
toMisoString (EnumValue Name
name) = Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name

-- | A GraphQL 'ObjectField'
-- https://spec.graphql.org/draft/#ObjectField
instance ToMisoString ObjectField where
    toMisoString :: ObjectField -> MisoString
toMisoString (ObjectField Name
name Value
value) =
        Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
":" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> Value -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Value
value

-- | GraphQL 'VariablesDefinition'
-- https://spec.graphql.org/draft/#VariablesDefinition
instance ToMisoString VariablesDefinition where
    toMisoString :: VariablesDefinition -> MisoString
toMisoString = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"(" MisoString
")" (MisoString -> MisoString)
-> (VariablesDefinition -> MisoString)
-> VariablesDefinition
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. VariablesDefinition -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords'

-- | A GraphQL 'VariableDefinition'
-- https://spec.graphql.org/draft/#VariableDefinition
instance ToMisoString VariableDefinition where
    toMisoString :: VariableDefinition -> MisoString
toMisoString (VariableDefinition Maybe Description
desc Variable
variable Type
type' Maybe DefaultValue
defaultValue Maybe Directives
directives) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Variable -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Variable
variable
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
":"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Type -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Type
type'
              , DefaultValue -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (DefaultValue -> MisoString)
-> Maybe DefaultValue -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe DefaultValue
defaultValue
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              ]

-- | A GraphQL 'Variable'
-- https://spec.graphql.org/draft/#Variable
instance ToMisoString Variable where
    toMisoString :: Variable -> MisoString
toMisoString (Variable Name
name) = MisoString
"$" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name

-- | A GraphQL 'DefaultValue'
-- https://spec.graphql.org/draft/#DefaultValue
instance ToMisoString DefaultValue where
    toMisoString :: DefaultValue -> MisoString
toMisoString (DefaultValue Value
value) = MisoString
"=" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> Value -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Value
value

-- | A GraphQL 'Type'
-- https://spec.graphql.org/draft/#Type
instance ToMisoString Type where
    toMisoString :: Type -> MisoString
toMisoString (TypeNonNull NonNullType
s) = NonNullType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString NonNullType
s
    toMisoString (TypeList ListType
listType) = ListType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ListType
listType
    toMisoString (TypeNamed NamedType
namedType) = NamedType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString NamedType
namedType

-- | A GraphQL 'NamedType'
-- https://spec.graphql.org/draft/#NamedType
instance ToMisoString NamedType where
    toMisoString :: NamedType -> MisoString
toMisoString (NamedType Name
name) = Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name

-- | A GraphQL 'ListType'
-- https://spec.graphql.org/draft/#ListType
instance ToMisoString ListType where
    toMisoString :: ListType -> MisoString
toMisoString (ListType Type
type') = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"[" MisoString
"]" (MisoString -> MisoString) -> MisoString -> MisoString
forall a b. (a -> b) -> a -> b
$ Type -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Type
type'

-- | A GraphQL 'NonNullType'
-- https://spec.graphql.org/draft/#NonNullType
instance ToMisoString NonNullType where
    toMisoString :: NonNullType -> MisoString
toMisoString (NonNullTypeNamed NamedType
namedType) = NamedType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString NamedType
namedType MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
"!"
    toMisoString (NonNullTypeList ListType
listType) = ListType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ListType
listType MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
"!"

-- | The GraphQL 'Directives' type
-- https://spec.graphql.org/draft/#Directives
instance ToMisoString Directives where
    toMisoString :: Directives -> MisoString
toMisoString = Directives -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords'

-- | A GraphQL 'Directive'
-- https://spec.graphql.org/draft/#Directive
instance ToMisoString Directive where
    toMisoString :: Directive -> MisoString
toMisoString (Directive Name
name Maybe Arguments
arguments) =
        [MisoString] -> MisoString
forall a. Monoid a => [a] -> a
mconcat
            [ MisoString
"@"
            , Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
            , MisoString
-> (Arguments -> MisoString) -> Maybe Arguments -> MisoString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe MisoString
"" Arguments -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Maybe Arguments
arguments
            ]

-- | A GraphQL 'TypeSystemDefinition'
-- https://spec.graphql.org/draft/#TypeSystemDefinition
instance ToMisoString TypeSystemDefinition where
    toMisoString :: TypeSystemDefinition -> MisoString
toMisoString (DefinitionSchema SchemaDefinition
schemaDefinition) = SchemaDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString SchemaDefinition
schemaDefinition
    toMisoString (DefinitionType TypeDefinition
typeDefinition) = TypeDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString TypeDefinition
typeDefinition
    toMisoString (DefinitionDirective DirectiveDefinition
directiveDefinition) = DirectiveDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString DirectiveDefinition
directiveDefinition

-- | A GraphQL 'TypeSystemExtension'
-- https://spec.graphql.org/draft/#TypeSystemExtension
instance ToMisoString TypeSystemExtension where
    toMisoString :: TypeSystemExtension -> MisoString
toMisoString (ExtensionSchema SchemaExtension
schemaExtension) = SchemaExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString SchemaExtension
schemaExtension
    toMisoString (ExtensionType TypeExtension
typeExtension) = TypeExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString TypeExtension
typeExtension

-- | A GraphQL 'SchemaDefinition'
-- https://spec.graphql.org/draft/#SchemaDefinition
instance ToMisoString SchemaDefinition where
    toMisoString :: SchemaDefinition -> MisoString
toMisoString (SchemaDefinition Maybe Description
desc Maybe Directives
directives RootOperationTypeDefinitions
rootOperationTypeDefinitions) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"schema"
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ RootOperationTypeDefinitions -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString RootOperationTypeDefinitions
rootOperationTypeDefinitions
              ]

-- | A GraphQL 'SchemaExtension'
-- https://spec.graphql.org/draft/#SchemaExtension
instance ToMisoString SchemaExtension where
    toMisoString :: SchemaExtension -> MisoString
toMisoString (SchemaExtension Maybe Directives
directives Maybe RootOperationTypeDefinitions
rootOperationTypeDefinitions) =
        [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"extend"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"schema"
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Maybe RootOperationTypeDefinitions -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Maybe RootOperationTypeDefinitions
rootOperationTypeDefinitions
              ]

-- | List of 'RootOperationTypeDefinition'
instance ToMisoString RootOperationTypeDefinitions where
    toMisoString :: RootOperationTypeDefinitions -> MisoString
toMisoString = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"{" MisoString
"}" (MisoString -> MisoString)
-> (RootOperationTypeDefinitions -> MisoString)
-> RootOperationTypeDefinitions
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. RootOperationTypeDefinitions -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords'

-- | https://spec.graphql.org/draft/#RootOperationTypeDefinition
instance ToMisoString RootOperationTypeDefinition where
    toMisoString :: RootOperationTypeDefinition -> MisoString
toMisoString (RootOperationTypeDefinition OperationType
operationType NamedType
namedType) =
        OperationType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString OperationType
operationType MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
":" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> NamedType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString NamedType
namedType

-- | A GraphQL 'Description'
-- https://spec.graphql.org/draft/#Description
instance ToMisoString Description where
    toMisoString :: Description -> MisoString
toMisoString (Description StringValue
stringValue) = StringValue -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString StringValue
stringValue

-- | A GraphQL 'TypeDefinition'
-- https://spec.graphql.org/draft/#TypeDefinition
instance ToMisoString TypeDefinition where
    toMisoString :: TypeDefinition -> MisoString
toMisoString (DefinitionScalarType ScalarTypeDefinition
scalarTypeDefinition) = ScalarTypeDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ScalarTypeDefinition
scalarTypeDefinition
    toMisoString (DefinitionObjectType ObjectTypeDefinition
objectTypeDefinition) = ObjectTypeDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ObjectTypeDefinition
objectTypeDefinition
    toMisoString (DefinitionInterfaceType InterfaceTypeDefinition
interfaceTypeDefinition) = InterfaceTypeDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString InterfaceTypeDefinition
interfaceTypeDefinition
    toMisoString (DefinitionUnionType UnionTypeDefinition
unionTypeDefinition) = UnionTypeDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString UnionTypeDefinition
unionTypeDefinition
    toMisoString (DefinitionEnumType EnumTypeDefinition
enumTypeDefinition) = EnumTypeDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString EnumTypeDefinition
enumTypeDefinition
    toMisoString (DefinitionInputObjectType InputObjectTypeDefinition
inputObjectTypeDefinition) = InputObjectTypeDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString InputObjectTypeDefinition
inputObjectTypeDefinition

-- | A GraphQL 'TypeExtension'
-- https://spec.graphql.org/draft/#TypeExtension
instance ToMisoString TypeExtension where
    toMisoString :: TypeExtension -> MisoString
toMisoString (ExtensionScalarType ScalarTypeExtension
scalarTypeExtension) = ScalarTypeExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ScalarTypeExtension
scalarTypeExtension
    toMisoString (ExtensionObjectType ObjectTypeExtension
objectTypeExtension) = ObjectTypeExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ObjectTypeExtension
objectTypeExtension
    toMisoString (ExtensionInterfaceType InterfaceTypeExtension
interfaceTypeExtension) = InterfaceTypeExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString InterfaceTypeExtension
interfaceTypeExtension
    toMisoString (ExtensionUnionType UnionTypeExtension
unionTypeExtension) = UnionTypeExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString UnionTypeExtension
unionTypeExtension
    toMisoString (ExtensionEnumType EnumTypeExtension
enumTypeExtension) = EnumTypeExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString EnumTypeExtension
enumTypeExtension
    toMisoString (ExtensionInputObjectType InputObjectTypeExtension
inputObjectTypeExtension) = InputObjectTypeExtension -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString InputObjectTypeExtension
inputObjectTypeExtension

-- | A GraphQL 'ScalarTypeDefinition'
-- https://spec.graphql.org/draft/#ScalarTypeDefinition
instance ToMisoString ScalarTypeDefinition where
    toMisoString :: ScalarTypeDefinition -> MisoString
toMisoString (ScalarTypeDefinition Maybe Description
desc Name
name Maybe Directives
directives) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"scalar"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              ]

-- | A GraphQL 'ScalarTypeExtension'
-- https://spec.graphql.org/draft/#ScalarTypeExtension
instance ToMisoString ScalarTypeExtension where
    toMisoString :: ScalarTypeExtension -> MisoString
toMisoString (ScalarTypeExtension Name
name Directives
directives) =
        [MisoString] -> MisoString
unwords
            [ MisoString
"extend"
            , MisoString
"scalar"
            , Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
            , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Directives
directives
            ]

-- | A GraphQL 'ObjectTypeDefinition'
-- https://spec.graphql.org/draft/#ObjectTypeDefinition
instance ToMisoString ObjectTypeDefinition where
    toMisoString :: ObjectTypeDefinition -> MisoString
toMisoString (ObjectTypeDefinition Maybe Description
desc Name
name Maybe ImplementsInterfaces
implementsInterfaces Maybe Directives
directives Maybe FieldsDefinition
fieldsDefinition) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"type"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , ImplementsInterfaces -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (ImplementsInterfaces -> MisoString)
-> Maybe ImplementsInterfaces -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ImplementsInterfaces
implementsInterfaces
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , FieldsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (FieldsDefinition -> MisoString)
-> Maybe FieldsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe FieldsDefinition
fieldsDefinition
              ]

-- | A GraphQL 'ObjectTypeExtension'
-- https://spec.graphql.org/draft/#ObjectTypeExtension
instance ToMisoString ObjectTypeExtension where
    toMisoString :: ObjectTypeExtension -> MisoString
toMisoString (ObjectTypeExtension Name
name Maybe ImplementsInterfaces
implementsInterfaces Maybe Directives
directives Maybe FieldsDefinition
fieldsDefinition) =
        [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"extend"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"type"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , ImplementsInterfaces -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (ImplementsInterfaces -> MisoString)
-> Maybe ImplementsInterfaces -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ImplementsInterfaces
implementsInterfaces
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , FieldsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (FieldsDefinition -> MisoString)
-> Maybe FieldsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe FieldsDefinition
fieldsDefinition
              ]

-- | A GraphQL 'ImplementsInterfaces'
-- https://spec.graphql.org/draft/#ImplementsInterfaces
instance ToMisoString ImplementsInterfaces where
    toMisoString :: ImplementsInterfaces -> MisoString
toMisoString (ImplementsInterfaces NonEmpty NamedType
types) =
        MisoString
"implements " MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString -> [MisoString] -> MisoString
intercalate MisoString
" & " (NamedType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (NamedType -> MisoString) -> [NamedType] -> [MisoString]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty NamedType -> [NamedType]
forall a. NonEmpty a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList NonEmpty NamedType
types)

-- | A GraphQL 'FieldsDefinition'
-- https://spec.graphql.org/draft/#FieldsDefinitionn
instance ToMisoString FieldsDefinition where
    toMisoString :: FieldsDefinition -> MisoString
toMisoString (FieldsDefinition NonEmpty FieldDefinition
fields) = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"{" MisoString
"}" (MisoString -> MisoString) -> MisoString -> MisoString
forall a b. (a -> b) -> a -> b
$ NonEmpty FieldDefinition -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords' NonEmpty FieldDefinition
fields

-- | A GraphQL 'FieldDefinition'
-- https://spec.graphql.org/draft/#FieldDefinition
instance ToMisoString FieldDefinition where
    toMisoString :: FieldDefinition -> MisoString
toMisoString (FieldDefinition Maybe Description
desc Name
name Maybe ArgumentsDefinition
argumentsDefinition Type
type' Maybe Directives
directives) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , ArgumentsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (ArgumentsDefinition -> MisoString)
-> Maybe ArgumentsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ArgumentsDefinition
argumentsDefinition
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
":"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Type -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Type
type'
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              ]

-- | https://spec.graphql.org/draft/#ArgumentsDefinition
instance ToMisoString ArgumentsDefinition where
    toMisoString :: ArgumentsDefinition -> MisoString
toMisoString (ArgumentsDefinition NonEmpty InputValueDefinition
args) = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"(" MisoString
")" (MisoString -> MisoString) -> MisoString -> MisoString
forall a b. (a -> b) -> a -> b
$ NonEmpty InputValueDefinition -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords' NonEmpty InputValueDefinition
args

-- | https://spec.graphql.org/draft/#InputValueDefinition
instance ToMisoString InputValueDefinition where
    toMisoString :: InputValueDefinition -> MisoString
toMisoString (InputValueDefinition Maybe Description
desc Name
name Type
type' Maybe DefaultValue
defaultValue Maybe Directives
directives) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
":"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Type -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Type
type'
              , DefaultValue -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (DefaultValue -> MisoString)
-> Maybe DefaultValue -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe DefaultValue
defaultValue
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              ]

-- | https://spec.graphql.org/draft/#InterfaceTypeDefinition
instance ToMisoString InterfaceTypeDefinition where
    toMisoString :: InterfaceTypeDefinition -> MisoString
toMisoString
        ( InterfaceTypeDefinition
                Maybe Description
desc
                Name
name
                Maybe ImplementsInterfaces
implementsInterfaces
                Maybe Directives
directives
                Maybe FieldsDefinition
fieldsDefinition
            ) =
            Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
                (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
                ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
                ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"interface"
                  , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
                  , ImplementsInterfaces -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (ImplementsInterfaces -> MisoString)
-> Maybe ImplementsInterfaces -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ImplementsInterfaces
implementsInterfaces
                  , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
                  , FieldsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (FieldsDefinition -> MisoString)
-> Maybe FieldsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe FieldsDefinition
fieldsDefinition
                  ]

-- | https://spec.graphql.org/draft/#InterfaceTypeExtension
instance ToMisoString InterfaceTypeExtension where
    toMisoString :: InterfaceTypeExtension -> MisoString
toMisoString (InterfaceTypeExtension Name
name Maybe ImplementsInterfaces
implementsInterfaces Maybe Directives
directives Maybe FieldsDefinition
fieldsDefinition) =
        [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"extend"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"interface"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , ImplementsInterfaces -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (ImplementsInterfaces -> MisoString)
-> Maybe ImplementsInterfaces -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ImplementsInterfaces
implementsInterfaces
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , FieldsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (FieldsDefinition -> MisoString)
-> Maybe FieldsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe FieldsDefinition
fieldsDefinition
              ]

-- | https://spec.graphql.org/draft/#UnionTypeDefinition
instance ToMisoString UnionTypeDefinition where
    toMisoString :: UnionTypeDefinition -> MisoString
toMisoString (UnionTypeDefinition Maybe Description
desc Name
name Maybe Directives
directives Maybe UnionMemberTypes
unionMemberTypes) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"union"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , UnionMemberTypes -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (UnionMemberTypes -> MisoString)
-> Maybe UnionMemberTypes -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe UnionMemberTypes
unionMemberTypes
              ]

-- | https://spec.graphql.org/draft/#UnionMemberTypes
instance ToMisoString UnionMemberTypes where
    toMisoString :: UnionMemberTypes -> MisoString
toMisoString (UnionMemberTypes NonEmpty NamedType
types) = MisoString -> [MisoString] -> MisoString
intercalate MisoString
" | " ([MisoString] -> MisoString) -> [MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ NamedType -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (NamedType -> MisoString) -> [NamedType] -> [MisoString]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty NamedType -> [NamedType]
forall a. NonEmpty a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList NonEmpty NamedType
types

-- | https://spec.graphql.org/draft/#UnionTypeExtension
instance ToMisoString UnionTypeExtension where
    toMisoString :: UnionTypeExtension -> MisoString
toMisoString (UnionTypeExtension Name
name Maybe Directives
directives Maybe UnionMemberTypes
unionMemberTypes) =
        [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"extend"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"union"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , UnionMemberTypes -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (UnionMemberTypes -> MisoString)
-> Maybe UnionMemberTypes -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe UnionMemberTypes
unionMemberTypes
              ]

-- | https://spec.graphql.org/draft/#EnumTypeDefinition
instance ToMisoString EnumTypeDefinition where
    toMisoString :: EnumTypeDefinition -> MisoString
toMisoString (EnumTypeDefinition Maybe Description
desc Name
name Maybe Directives
directives Maybe EnumValuesDefinition
enumValuesDefinition) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"enum"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , EnumValuesDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (EnumValuesDefinition -> MisoString)
-> Maybe EnumValuesDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe EnumValuesDefinition
enumValuesDefinition
              ]

-- | https://spec.graphql.org/draft/#EnumValuesDefinition
instance ToMisoString EnumValuesDefinition where
    toMisoString :: EnumValuesDefinition -> MisoString
toMisoString (EnumValuesDefinition NonEmpty EnumValueDefinition
values) = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"{" MisoString
"}" (MisoString -> MisoString) -> MisoString -> MisoString
forall a b. (a -> b) -> a -> b
$ NonEmpty EnumValueDefinition -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords' NonEmpty EnumValueDefinition
values

-- | https://spec.graphql.org/draft/#EnumValueDefinition
instance ToMisoString EnumValueDefinition where
    toMisoString :: EnumValueDefinition -> MisoString
toMisoString (EnumValueDefinition Maybe Description
desc EnumValue
enumValue Maybe Directives
directives) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ EnumValue -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString EnumValue
enumValue
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              ]

-- | https://spec.graphql.org/draft/#EnumTypeExtension
instance ToMisoString EnumTypeExtension where
    toMisoString :: EnumTypeExtension -> MisoString
toMisoString (EnumTypeExtension Name
name Maybe Directives
directives Maybe EnumValuesDefinition
enumValuesDefinition) =
        [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"extend"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"enum"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , EnumValuesDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (EnumValuesDefinition -> MisoString)
-> Maybe EnumValuesDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe EnumValuesDefinition
enumValuesDefinition
              ]

-- | InputObjectTypeDefinition
-- https://spec.graphql.org/draft/#InputObjectTypeDefinition
instance ToMisoString InputObjectTypeDefinition where
    toMisoString :: InputObjectTypeDefinition -> MisoString
toMisoString (InputObjectTypeDefinition Maybe Description
desc Name
name Maybe Directives
directives Maybe InputFieldsDefinition
inputFieldsDefinition) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"input"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , InputFieldsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (InputFieldsDefinition -> MisoString)
-> Maybe InputFieldsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe InputFieldsDefinition
inputFieldsDefinition
              ]

-- | InputFieldsDefinition
-- https://spec.graphql.org/draft/#InputFieldsDefinition
instance ToMisoString InputFieldsDefinition where
    toMisoString :: InputFieldsDefinition -> MisoString
toMisoString (InputFieldsDefinition NonEmpty InputValueDefinition
fields) = MisoString -> MisoString -> MisoString -> MisoString
enclosed MisoString
"{" MisoString
"}" (MisoString -> MisoString) -> MisoString -> MisoString
forall a b. (a -> b) -> a -> b
$ NonEmpty InputValueDefinition -> MisoString
forall (f :: * -> *) a.
(Foldable f, ToMisoString a) =>
f a -> MisoString
unwords' NonEmpty InputValueDefinition
fields

-- | InputObjectTypeExtension
-- https://spec.graphql.org/draft/#InputObjectTypeExtension
instance ToMisoString InputObjectTypeExtension where
    toMisoString :: InputObjectTypeExtension -> MisoString
toMisoString (InputObjectTypeExtension Name
name Maybe Directives
directives Maybe InputFieldsDefinition
inputFieldsDefinition) =
        [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"extend"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"input"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , Directives -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (Directives -> MisoString) -> Maybe Directives -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Directives
directives
              , InputFieldsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (InputFieldsDefinition -> MisoString)
-> Maybe InputFieldsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe InputFieldsDefinition
inputFieldsDefinition
              ]

-- | Directive definition
-- https://spec.graphql.org/draft/#DirectiveDefinition
instance ToMisoString DirectiveDefinition where
    toMisoString :: DirectiveDefinition -> MisoString
toMisoString (DirectiveDefinition Maybe Description
desc Name
name Maybe ArgumentsDefinition
argumentsDefinition Bool
repeatable DirectiveLocations
directiveLocations) =
        Maybe Description -> MisoString -> MisoString
withDesc Maybe Description
desc
            (MisoString -> MisoString)
-> ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [MisoString] -> MisoString
unwords
            ([MisoString] -> MisoString)
-> ([Maybe MisoString] -> [MisoString])
-> [Maybe MisoString]
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Maybe MisoString] -> [MisoString]
forall a. [Maybe a] -> [a]
catMaybes
            ([Maybe MisoString] -> MisoString)
-> [Maybe MisoString] -> MisoString
forall a b. (a -> b) -> a -> b
$ [ MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"directive"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ MisoString
"@" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> Name -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString Name
name
              , ArgumentsDefinition -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString (ArgumentsDefinition -> MisoString)
-> Maybe ArgumentsDefinition -> Maybe MisoString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ArgumentsDefinition
argumentsDefinition
              , Maybe MisoString -> Maybe MisoString -> Bool -> Maybe MisoString
forall a. a -> a -> Bool -> a
bool Maybe MisoString
forall a. Maybe a
Nothing (MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"repeatable") Bool
repeatable
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"on"
              , MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just (MisoString -> Maybe MisoString) -> MisoString -> Maybe MisoString
forall a b. (a -> b) -> a -> b
$ DirectiveLocations -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString DirectiveLocations
directiveLocations
              ]

-- | https://spec.graphql.org/draft/#DirectiveLocations
instance ToMisoString DirectiveLocations where
    toMisoString :: DirectiveLocations -> MisoString
toMisoString = MisoString -> [MisoString] -> MisoString
intercalate MisoString
" | " ([MisoString] -> MisoString)
-> (DirectiveLocations -> [MisoString])
-> DirectiveLocations
-> MisoString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (DirectiveLocation -> MisoString)
-> [DirectiveLocation] -> [MisoString]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DirectiveLocation -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ([DirectiveLocation] -> [MisoString])
-> (DirectiveLocations -> [DirectiveLocation])
-> DirectiveLocations
-> [MisoString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. DirectiveLocations -> [DirectiveLocation]
forall a. NonEmpty a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList

-- | https://spec.graphql.org/draft/#DirectiveLocation
instance ToMisoString DirectiveLocation where
    toMisoString :: DirectiveLocation -> MisoString
toMisoString (LocationExecutableDirective ExecutableDirectiveLocation
executableDirectiveLocation) = ExecutableDirectiveLocation -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString ExecutableDirectiveLocation
executableDirectiveLocation
    toMisoString (LocationTypeSystemDirective TypeSystemDirectiveLocation
typeSystemDirectiveLocation) = TypeSystemDirectiveLocation -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString TypeSystemDirectiveLocation
typeSystemDirectiveLocation

-- | https://spec.graphql.org/draft/#ExecutableDirectiveLocation
instance ToMisoString ExecutableDirectiveLocation where
    toMisoString :: ExecutableDirectiveLocation -> MisoString
toMisoString ExecutableDirectiveLocation
QUERY = MisoString
"QUERY"
    toMisoString ExecutableDirectiveLocation
MUTATION = MisoString
"MUTATION"
    toMisoString ExecutableDirectiveLocation
SUBSCRIPTION = MisoString
"SUBSCRIPTION"
    toMisoString ExecutableDirectiveLocation
FIELD = MisoString
"FIELD"
    toMisoString ExecutableDirectiveLocation
FRAGMENT_DEFINITION = MisoString
"FRAGMENT_DEFINITION"
    toMisoString ExecutableDirectiveLocation
FRAGMENT_SPREAD = MisoString
"FRAGMENT_SPREAD"
    toMisoString ExecutableDirectiveLocation
INLINE_FRAGMENT = MisoString
"INLINE_FRAGMENT"
    toMisoString ExecutableDirectiveLocation
VARIABLE_DEFINITION = MisoString
"VARIABLE_DEFINITION"

-- | https://spec.graphql.org/draft/#TypeSystemDirectiveLocation
instance ToMisoString TypeSystemDirectiveLocation where
    toMisoString :: TypeSystemDirectiveLocation -> MisoString
toMisoString TypeSystemDirectiveLocation
SCHEMA = MisoString
"SCHEMA"
    toMisoString TypeSystemDirectiveLocation
SCALAR = MisoString
"SCALAR"
    toMisoString TypeSystemDirectiveLocation
OBJECT = MisoString
"OBJECT"
    toMisoString TypeSystemDirectiveLocation
FIELD_DEFINITION = MisoString
"FIELD_DEFINITION"
    toMisoString TypeSystemDirectiveLocation
ARGUMENT_DEFINITION = MisoString
"ARGUMENT_DEFINITION"
    toMisoString TypeSystemDirectiveLocation
INTERFACE = MisoString
"INTERFACE"
    toMisoString TypeSystemDirectiveLocation
UNION = MisoString
"UNION"
    toMisoString TypeSystemDirectiveLocation
ENUM = MisoString
"ENUM"
    toMisoString TypeSystemDirectiveLocation
ENUM_VALUE = MisoString
"ENUM_VALUE"
    toMisoString TypeSystemDirectiveLocation
INPUT_OBJECT = MisoString
"INPUT_OBJECT"
    toMisoString TypeSystemDirectiveLocation
INPUT_FIELD_DEFINITION = MisoString
"INPUT_FIELD_DEFINITION"