================================================================================
Alternative patterns
================================================================================

val x = y match {
  case 1 | a => b
  case "c" | "d" | "e" => f
}

--------------------------------------------------------------------------------

(compilation_unit
  (val_definition
    (identifier)
    (match_expression
      (identifier)
      (case_block
        (case_clause
          (alternative_pattern
            (integer_literal)
            (identifier))
          (identifier))
        (case_clause
          (alternative_pattern
            (alternative_pattern
              (string)
              (string))
            (string))
          (identifier))))))

================================================================================
Typed patterns
================================================================================

val x = y match {
  case 1 : Int => 2
  case a : B with C => d
  case _: B | _: C => 3
  case Object.Constant => 3
}

--------------------------------------------------------------------------------

(compilation_unit
  (val_definition
    (identifier)
    (match_expression
      (identifier)
      (case_block
        (case_clause
          (typed_pattern
            (integer_literal)
            (type_identifier))
          (integer_literal))
        (case_clause
          (typed_pattern
            (identifier)
            (compound_type
              (type_identifier)
              (type_identifier)))
          (identifier))
        (case_clause
          (alternative_pattern
            (typed_pattern
              (wildcard)
              (type_identifier))
            (typed_pattern
              (wildcard)
              (type_identifier)))
          (integer_literal))
        (case_clause
          (stable_identifier
            (identifier)
            (identifier))
          (integer_literal))))))

================================================================================
Tuple patterns
================================================================================

val (a, b) = if (c) (d, e) else (f, g)

val x = y match {
  case (A, B) => X
}

--------------------------------------------------------------------------------

(compilation_unit
  (val_definition
    (tuple_pattern
      (identifier)
      (identifier))
    (if_expression
      (parenthesized_expression
        (identifier))
      (tuple_expression
        (identifier)
        (identifier))
      (tuple_expression
        (identifier)
        (identifier))))
  (val_definition
    (identifier)
    (match_expression
      (identifier)
      (case_block
        (case_clause
          (tuple_pattern
            (identifier)
            (identifier))
          (identifier))))))

================================================================================
Case class patterns
================================================================================

def showNotification(notification: Notification): String = {
  notification match {
    case Email(email, title, _) =>
      s"You got an email from $email with title: $title"
    case SMS(number, message) =>
      s"You got an SMS from $number! Message: $message"
    case VoiceRecording(name, link) =>
      s"you received a Voice Recording from $name! Click the link to hear it: $link"
  }
}

--------------------------------------------------------------------------------

(compilation_unit
  (function_definition
    (identifier)
    (parameters
      (parameter
        (identifier)
        (type_identifier)))
    (type_identifier)
    (block
      (match_expression
        (identifier)
        (case_block
          (case_clause
            (case_class_pattern
              (type_identifier)
              (identifier)
              (identifier)
              (wildcard))
            (interpolated_string_expression
              (identifier)
              (interpolated_string
                (interpolation
                  (identifier))
                (interpolation
                  (identifier)))))
          (case_clause
            (case_class_pattern
              (type_identifier)
              (identifier)
              (identifier))
            (interpolated_string_expression
              (identifier)
              (interpolated_string
                (interpolation
                  (identifier))
                (interpolation
                  (identifier)))))
          (case_clause
            (case_class_pattern
              (type_identifier)
              (identifier)
              (identifier))
            (interpolated_string_expression
              (identifier)
              (interpolated_string
                (interpolation
                  (identifier))
                (interpolation
                  (identifier))))))))))

================================================================================
Infix patterns
================================================================================

def first(x: Seq[Int]) = x match {
  case e :+ _ => Some(e)
  case _ => None
}

--------------------------------------------------------------------------------

(compilation_unit
  (function_definition
    (identifier)
    (parameters
      (parameter
        (identifier)
        (generic_type
          (type_identifier)
          (type_arguments
            (type_identifier)))))
    (match_expression
      (identifier)
      (case_block
        (case_clause
          (infix_pattern
            (identifier)
            (operator_identifier)
            (wildcard))
          (call_expression
            (identifier)
            (arguments
              (identifier))))
        (case_clause
          (wildcard)
          (identifier))))))

================================================================================
Capture patterns
================================================================================

val x = y match {
  case a @ B(1) => a
  case b @ C(d @ (e @ X, _: Y)) => e
  case req @ (POST | GET) -> Root / "test" => 5
  case Array(a: Type, _@_*) => y
}

--------------------------------------------------------------------------------

(compilation_unit
  (val_definition
    (identifier)
    (match_expression
      (identifier)
      (case_block
        (case_clause
          (capture_pattern
            (identifier)
            (case_class_pattern
              (type_identifier)
              (integer_literal)))
          (identifier))
        (case_clause
          (capture_pattern
            (identifier)
            (case_class_pattern
              (type_identifier)
              (capture_pattern
                (identifier)
                (tuple_pattern
                  (capture_pattern
                    (identifier)
                    (identifier))
                  (typed_pattern
                    (wildcard)
                    (type_identifier))))))
          (identifier))
        (case_clause
          (infix_pattern
            (infix_pattern
              (capture_pattern
                (identifier)
                (tuple_pattern
                  (alternative_pattern
                    (identifier)
                    (identifier))))
              (operator_identifier)
              (identifier))
            (operator_identifier)
            (string))
          (integer_literal))
        (case_clause
          (case_class_pattern
            (type_identifier)
            (typed_pattern
              (identifier)
              (type_identifier))
            (repeat_pattern
              (capture_pattern
                (wildcard)
                (wildcard))))
          (identifier))))))

================================================================================
Quoted patterns (Scala 3 syntax)
================================================================================

def foo =
  x match
    case '{ $boolExpr } => Some(true)
    case _              => None

--------------------------------------------------------------------------------

(compilation_unit
  (function_definition
    (identifier)
    (indented_block
      (match_expression
        (identifier)
        (indented_cases
          (case_clause
            (quote_expression
              (identifier))
            (call_expression
              (identifier)
              (arguments
                (boolean_literal))))
          (case_clause
            (wildcard)
            (identifier)))))))

================================================================================
Given pattern (Scala 3 syntax)
================================================================================

for  
  given Int <- Some(1)
yield ()

--------------------------------------------------------------------------------

(compilation_unit
  (for_expression
    (enumerators
      (enumerator
        (given_pattern
          (type_identifier))
        (call_expression
          (identifier)
          (arguments
            (integer_literal)))))
    (unit)))
