anchor.diff:      %% '(' -..- +.(qty.[1..] /. ignored * withSource argument) -- ')'
       -%> auto
   
  +(**
  +
  +The
  +[spec on directives](https://facebook.github.io/graphql/#sec-Language.Directives)
  +explains that they can be used to describe additional information for fields, fragments, and operations.
  +
  +A directive looks like this:
  +    @dirName
  +Or, with arguments:
  +    @dirName(arg1: value1, arg2: value2)
  +
  +*)
   type Directive =
       {
           DirectiveName : string
           Arguments : Argument ListWithSource
       }
   
  +/// Runs the given list parser, which parses a list of one or more elements,
  +/// or returns an empty list. This is useful when a list is optional but must
  +/// contain at least one item if it is present, which is common in GraphQL.
  +let optionalMany parser =
  +    %[
  +        parser
  +        preturn (new ResizeArray<_>())
  +    ]
  +
  +/// Parses a list of 0 or more directives.
   let directives =
       let directive =
           %% '@' -- +.name
  
positive.code:     -..- +.optionalMany directives
      -%> fun name dirs ->
          { FragmentName = name; Directives = dirs }
  
  type TypeName = string
  
  
negative.code: 
  Now that we have values, let's keep building up to full queries.
  
  An [argument](https://facebook.github.io/graphql/#sec-Language.Arguments)
  is a named value. It is found in an argument list, which looks like this:
      (arg1: value1, arg2: value2)
  Remember, however, that the commas are entirely optional, since they are ignored tokens.
  
  *)
  
  /// Represents an `argName: argValue` pair
  type Argument =
      {
          ArgumentName : string
          ArgumentValue : Value
      }
  
  /// Parses an argument list wrapped in parentheses. Per the GraphQL spec,
  /// this list must contain at least one argument.
  let arguments =
      let argument =
          %% +.name
  