# Boolean condition before a let chain

fn check(enabled: bool, value: Option<u8>) {
  if enabled && let Some(x) = value && x > 0 {}
}

==>

SourceFile(
  FunctionItem(
    fn,
    BoundIdentifier,
    ParamList(
      Parameter(BoundIdentifier, TypeIdentifier),
      Parameter(BoundIdentifier, GenericType(TypeIdentifier, TypeArgList(TypeIdentifier)))),
    Block(
      ExpressionStatement(
        IfExpression(
          if,
          LetChain(
            Identifier,
            LetDeclaration(let, TuplePattern(TypeIdentifier, BoundIdentifier), Identifier),
            BinaryExpression(Identifier, CompareOp, Integer)),
          Block)))))

# Let condition in a match guard

fn check(value: Option<u8>) {
  match value { _ if true && let Some(x) = value => {}, _ => {} }
}

==>

SourceFile(
  FunctionItem(
    fn,
    BoundIdentifier,
    ParamList(Parameter(BoundIdentifier, GenericType(TypeIdentifier, TypeArgList(TypeIdentifier)))),
    Block(
      ExpressionStatement(
        MatchExpression(
          match,
          Identifier,
          MatchBlock(
            MatchArm(
              _,
              Guard(if, LetChain(Boolean, LetDeclaration(let, TuplePattern(TypeIdentifier, BoundIdentifier), Identifier))),
              Block),
            MatchArm(_, Block)))))))

# Let condition before a let chain

fn compare(left: Option<u8>, right: Option<u8>) {
  if let Some(left) = left && let Some(right) = right && left < right {}
}

==>

SourceFile(
  FunctionItem(
    fn,
    BoundIdentifier,
    ParamList(
      Parameter(BoundIdentifier, GenericType(TypeIdentifier, TypeArgList(TypeIdentifier))),
      Parameter(BoundIdentifier, GenericType(TypeIdentifier, TypeArgList(TypeIdentifier)))),
    Block(
      ExpressionStatement(
        IfExpression(
          if,
          LetChain(
            LetDeclaration(let, TuplePattern(TypeIdentifier, BoundIdentifier), Identifier),
            LetDeclaration(let, TuplePattern(TypeIdentifier, BoundIdentifier), Identifier),
            BinaryExpression(Identifier, CompareOp, Identifier)),
          Block)))))
