==================
If-else expression
==================

fn check(x) {
    if x > 0 {
        "positive"
    } else {
        "non-positive"
    }
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters
      (identifier))
    body: (block
      (expression_statement
        (if_expression
          condition: (binary_expression
            left: (identifier)
            right: (integer_literal))
          consequence: (block
            (string_literal
              (string_content)))
          alternative: (else_clause
            (block
              (string_literal
                (string_content)))))))))

==================
Match expression with guard
==================

fn classify(n) {
    match n {
        0 => "zero",
        n if n < 0 => "negative",
        _ => "positive",
    }
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters
      (identifier))
    body: (block
      (expression_statement
        (match_expression
          value: (identifier)
          body: (match_block
            (match_arm
              pattern: (match_pattern
                (integer_literal))
              value: (string_literal
                (string_content)))
            (match_arm
              pattern: (match_pattern
                (identifier)
                condition: (binary_expression
                  left: (identifier)
                  right: (integer_literal)))
              value: (string_literal
                (string_content)))
            (match_arm
              pattern: (match_pattern)
              value: (string_literal
                (string_content)))))))))

==================
For loop
==================

fn main() {
    for item in items {
        item
    }
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters)
    body: (block
      (expression_statement
        (for_expression
          pattern: (identifier)
          value: (identifier)
          body: (block
            (identifier)))))))

==================
Loop with yield
==================

fn fibonacci() {
    let a = 0;
    let b = 1;
    loop {
        yield a;
        let c = a + b;
        a = b;
        b = c;
    }
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters)
    body: (block
      (let_declaration
        pattern: (identifier)
        value: (integer_literal))
      (let_declaration
        pattern: (identifier)
        value: (integer_literal))
      (expression_statement
        (loop_expression
          body: (block
            (expression_statement
              (yield_expression
                (identifier)))
            (let_declaration
              pattern: (identifier)
              value: (binary_expression
                left: (identifier)
                right: (identifier)))
            (expression_statement
              (assignment_expression
                left: (identifier)
                right: (identifier)))
            (expression_statement
              (assignment_expression
                left: (identifier)
                right: (identifier)))))))))
