===================================================
Simple parameters
===================================================

a => 1
() => 2
(d, e) => 3
(f, g) => {
  h
}
(trailing,) => 4
(h, trailing,) => 5
(set, kv) => 2
(a, .b, c, .d) => 7

---

(source_file
  (expression_statement (function
    (value_identifier)
    (number)))
  (expression_statement (function
    (formal_parameters)
    (number)))
  (expression_statement (function
    (formal_parameters (value_identifier) (value_identifier))
    (number)))
  (expression_statement (function
    (formal_parameters (value_identifier) (value_identifier))
    (block
      (expression_statement (value_identifier)))))
  (expression_statement (function
    (formal_parameters (value_identifier))
    (number)))
  (expression_statement (function
    (formal_parameters (value_identifier) (value_identifier))
    (number)))
  (expression_statement (function
    (formal_parameters (value_identifier) (value_identifier)) (number)))
  (expression_statement (function
    (formal_parameters
      (value_identifier)
      (uncurry)
      (value_identifier)
      (value_identifier)
      (uncurry)
      (value_identifier))
    (number))))

===================================================
Type annotations
===================================================

(x: int, ~y: float): int => 5

---

(source_file
  (expression_statement
    (function
      parameters: (formal_parameters
        (value_identifier) (type_annotation (type_identifier))
        (labeled_parameter (value_identifier) (type_annotation (type_identifier))))
      return_type: (type_annotation (type_identifier))
      body: (number))))

===================================================
Type arguments
===================================================

let foo = (type a, x: 'a): a => x

---

(source_file
  (let_binding
    (value_identifier)
    (function
      (formal_parameters
        (type_parameter (type_identifier))
        (value_identifier)
        (type_annotation (type_identifier)))
      (type_annotation (type_identifier))
      (value_identifier))))

===================================================
Parameter defaults
===================================================

(~x: int=3, ~y=4.0, ~z: int=?, ~w=?, ()) => 5

---

(source_file
  (expression_statement
    (function
      parameters: (formal_parameters
        (labeled_parameter
          (value_identifier)
          (type_annotation (type_identifier))
          default_value: (number))
        (labeled_parameter
          (value_identifier)
          default_value: (number))
        (labeled_parameter
          (value_identifier)
          (type_annotation (type_identifier)))
        (labeled_parameter
          (value_identifier))
        (unit))
      body: (number))))

===================================================
Parameter aliasing
===================================================

(~xTheGreat as x: int=3) => 5

---

(source_file
  (expression_statement
    (function
      (formal_parameters
        (labeled_parameter
          (value_identifier)
          (as_aliasing (value_identifier))
          (type_annotation (type_identifier))
          (number)))
      (number))))

===================================================
Record pattern
===================================================

({fooField, barField: {baz, qux}, mooField: baa}) => 5

---

(source_file
  (expression_statement (function
    (formal_parameters
      (record_pattern
        (value_identifier)
        (value_identifier)
        (record_pattern
          (value_identifier)
          (value_identifier))
        (value_identifier)
        (value_identifier)))
    (number))))

===================================================
Ref assignment as body
===================================================

reactRef => myRef := Some(reactRef)

---

(source_file
  (expression_statement
    (function
      (value_identifier)
      (mutation_expression
        (value_identifier)
        (variant
          (variant_identifier)
          (arguments (value_identifier)))))))

===================================================
Operator precendence
===================================================

(a) => a->Foo.bar == 5

---

(source_file
  (expression_statement (function
    (formal_parameters (value_identifier))
    (binary_expression
      (pipe_expression
        (value_identifier)
        (value_identifier_path (module_identifier) (value_identifier)))
      (number)))))
