=====================================
Case with one branch
=====================================

update msg =
    case msg of
        Nothing ->
            Nothing

---

(file
  (value_declaration
    (function_declaration_left (lower_case_identifier) (lower_pattern (lower_case_identifier)))
    (eq)
    (case_of_expr (case) (value_expr (value_qid (lower_case_identifier))) (of)
      
        (case_of_branch
            (pattern (union_pattern (upper_case_qid (upper_case_identifier))))
            (arrow)
            (value_expr (upper_case_qid (upper_case_identifier)))
        )
    )
  )
  
)
=====================================
Case with one branch and comment
=====================================

update msg value =
  case value of
    S ->
      value -- Debug

---

(file
  (value_declaration
    (function_declaration_left (lower_case_identifier) (lower_pattern (lower_case_identifier)) (lower_pattern (lower_case_identifier)))
    (eq)
    (case_of_expr (case) (value_expr (value_qid (lower_case_identifier))) (of)
      
        (case_of_branch
            (pattern (union_pattern (upper_case_qid (upper_case_identifier))))
            (arrow)
            (value_expr (value_qid (lower_case_identifier)))))) (line_comment)
)



=====================================
Case with two branches
=====================================

update msg model =
    case msg of
        Increment ->
            model + 1

        Decrement ->
            model - 1

---

(file
  (value_declaration
    (function_declaration_left (lower_case_identifier) (lower_pattern (lower_case_identifier)) (lower_pattern (lower_case_identifier)))
    (eq)
    (case_of_expr (case) (value_expr (value_qid (lower_case_identifier))) (of)
      
        (case_of_branch (pattern (union_pattern (upper_case_qid (upper_case_identifier)))) (arrow)
                (bin_op_expr (value_expr (value_qid (lower_case_identifier))) (operator (operator_identifier)) (number_constant_expr (number_literal))))
        
        (case_of_branch (pattern (union_pattern (upper_case_qid (upper_case_identifier)))) (arrow)
                (bin_op_expr (value_expr (value_qid (lower_case_identifier))) (operator (operator_identifier)) (number_constant_expr (number_literal))))
    )
  )
  
)

=====================================
Case with anonymous function
=====================================

enum =
    \stringList ->
        case stringList of
            [ str ] ->
                get str dict

            _ ->
                Nothing

---

(file
    (value_declaration
        (function_declaration_left (lower_case_identifier))
        (eq)
        (anonymous_function_expr
            (backslash)
            (pattern (lower_pattern (lower_case_identifier)))
            (arrow)
            (case_of_expr
                (case)
                (value_expr (value_qid (lower_case_identifier)))
                (of)
                
                (case_of_branch
                    (pattern
                        (list_pattern
                            (left_square_bracket)
                            (pattern (lower_pattern (lower_case_identifier)))
                            (right_square_bracket)
                        )
                    )
                    (arrow)
                    (function_call_expr
                        (value_expr (value_qid (lower_case_identifier)))
                        (value_expr (value_qid (lower_case_identifier)))
                        (value_expr (value_qid (lower_case_identifier)))
                    )
                )
                
                (case_of_branch
                    (pattern (anything_pattern (underscore)))
                    (arrow)
                    (value_expr (upper_case_qid (upper_case_identifier)))
                )
            )
        )
    )
    
)



=====================================
Case with three branches
=====================================

src : Avatar -> Attribute msg
src (Avatar maybeUrl)=
    case maybeUrl of
        Nothing ->
            Asset.src Asset.defaultAvatar

        Just "" ->
            Asset.src Asset.defaultAvatar

        Just url ->
            Html.Attributes.src url


---

(file
    (type_annotation
        (lower_case_identifier)
        (colon)
        (type_expression
            (type_ref (upper_case_qid (upper_case_identifier)))
            (arrow)
            (type_ref
                (upper_case_qid (upper_case_identifier))
                (type_variable (lower_case_identifier))
            )
        )
    )
    
    (value_declaration
        (function_declaration_left
            (lower_case_identifier)
            (left_parenthesis)
            (pattern
                (union_pattern
                    (upper_case_qid (upper_case_identifier))
                    (lower_pattern (lower_case_identifier))
                )
            )
            (right_parenthesis)
        )
        (eq)
        (case_of_expr
            (case)
            (value_expr (value_qid (lower_case_identifier)))
            (of)
            
            (case_of_branch
                (pattern (union_pattern (upper_case_qid (upper_case_identifier))))
                (arrow)
                (function_call_expr
                    (value_expr (value_qid (upper_case_identifier) (dot) (lower_case_identifier)))
                    (value_expr (value_qid (upper_case_identifier) (dot) (lower_case_identifier)))
                )
            )
            
            (case_of_branch
                (pattern
                    (union_pattern
                        (upper_case_qid (upper_case_identifier))
                        (string_constant_expr (open_quote) (close_quote))
                    )
                )
                (arrow)
                (function_call_expr
                    (value_expr (value_qid (upper_case_identifier) (dot) (lower_case_identifier)))
                    (value_expr (value_qid (upper_case_identifier) (dot) (lower_case_identifier)))
                )
            )
            
            (case_of_branch
                (pattern
                    (union_pattern
                        (upper_case_qid (upper_case_identifier))
                        (lower_pattern (lower_case_identifier))
                    )
                )
                (arrow)
                (function_call_expr
                    (value_expr
                        (value_qid
                            (upper_case_identifier)
                            (dot)
                            (upper_case_identifier)
                            (dot)
                            (lower_case_identifier)
                        )
                    )
                    (value_expr (value_qid (lower_case_identifier)))
                )
            )
        )
    )
    
)


=====================================
Function statement with nested case
=====================================

map3 func ma mb mc =
    case ma of
        Nothing ->
            Nothing

        Just a ->
            case mb of
                Nothing ->
                    Nothing

                Just b ->
                    b


map4 func ma mb mc md =
    case ma of
        Nothing ->
            Nothing

        Just a ->
            a



---

(file
    (value_declaration
        (function_declaration_left
            (lower_case_identifier)
            (lower_pattern (lower_case_identifier))
            (lower_pattern (lower_case_identifier))
            (lower_pattern (lower_case_identifier))
            (lower_pattern (lower_case_identifier))
        )
        (eq)
        (case_of_expr
            (case)
            (value_expr (value_qid (lower_case_identifier)))
            (of)
            
            (case_of_branch
                (pattern (union_pattern (upper_case_qid (upper_case_identifier))))
                (arrow)
                (value_expr (upper_case_qid (upper_case_identifier)))
            )
            
            (case_of_branch
                (pattern (union_pattern (upper_case_qid (upper_case_identifier)) (lower_pattern (lower_case_identifier))))
                (arrow)
                (case_of_expr
                    (case)
                    (value_expr (value_qid (lower_case_identifier)))
                    (of)
                    
                    (case_of_branch
                        (pattern (union_pattern (upper_case_qid (upper_case_identifier))))
                        (arrow)
                        (value_expr (upper_case_qid (upper_case_identifier)))
                    )
                    
                    (case_of_branch
                        (pattern (union_pattern (upper_case_qid (upper_case_identifier)) (lower_pattern (lower_case_identifier))))
                        (arrow)
                        (value_expr (value_qid (lower_case_identifier)))
                    )
                    
                )
            )
            
        )
    )
    
    (value_declaration
        (function_declaration_left
            (lower_case_identifier)
            (lower_pattern (lower_case_identifier))
            (lower_pattern (lower_case_identifier))
            (lower_pattern (lower_case_identifier))
            (lower_pattern (lower_case_identifier))
            (lower_pattern (lower_case_identifier))
        )
        (eq)
        (case_of_expr
            (case)
            (value_expr (value_qid (lower_case_identifier)))
            (of)
            
            (case_of_branch
                (pattern (union_pattern (upper_case_qid (upper_case_identifier))))
                (arrow)
                (value_expr (upper_case_qid (upper_case_identifier)))
            )
            
            (case_of_branch
                (pattern (union_pattern (upper_case_qid (upper_case_identifier)) (lower_pattern (lower_case_identifier))))
                (arrow)
                (value_expr (value_qid (lower_case_identifier)))
            )
        )
    )
    
)

=====================================
Case int result
=====================================

toIntResult s =
    case String.toInt s of
        Just i ->
            Ok i
        Nothing ->
            Err <| "could not convert string '" ++ s ++ "' to an Int"
---
(file
    (value_declaration
        (function_declaration_left
            (lower_case_identifier)
            (lower_pattern (lower_case_identifier))
        )
        (eq)
        (case_of_expr
            (case)
            (function_call_expr
                (value_expr
                    (value_qid (upper_case_identifier) (dot) (lower_case_identifier))
                )
                (value_expr (value_qid (lower_case_identifier)))
            )
            (of)
            
            (case_of_branch
                (pattern
                    (union_pattern
                        (upper_case_qid (upper_case_identifier))
                        (lower_pattern (lower_case_identifier))
                    )
                )
                (arrow)
                (function_call_expr
                    (value_expr (upper_case_qid (upper_case_identifier)))
                    (value_expr (value_qid (lower_case_identifier)))
                )
            )
            
            (case_of_branch
                (pattern
                    (union_pattern (upper_case_qid (upper_case_identifier))))
                (arrow)
                (bin_op_expr
                    (value_expr (upper_case_qid (upper_case_identifier)))
                    (operator (operator_identifier))
                    (string_constant_expr (open_quote) (regular_string_part) (close_quote))
                    (operator (operator_identifier))
                    (value_expr (value_qid (lower_case_identifier)))
                    (operator (operator_identifier))
                    (string_constant_expr (open_quote) (regular_string_part) (close_quote))
                )
            )
        )
    )
    
)


=====================================
Case with list
=====================================
enum key dict =
  custom key <| \stringList ->
    case stringList of
      [str] ->
        Dict.get str dict

      _ ->
        Nothing

---
(file 
    (value_declaration 
        (function_declaration_left 
            (lower_case_identifier) 
            (lower_pattern (lower_case_identifier)) 
            (lower_pattern (lower_case_identifier))
        ) 
        (eq) 
        (bin_op_expr 
            (function_call_expr 
            (value_expr 
            (value_qid 
            (lower_case_identifier))) 
            (value_expr 
            (value_qid 
            (lower_case_identifier)))) 
            (operator 
            (operator_identifier)) 
            (anonymous_function_expr 
                (backslash) 
                (pattern (lower_pattern (lower_case_identifier))) 
                (arrow) 
                (case_of_expr 
                    (case) 
                    (value_expr 
                        (value_qid (lower_case_identifier))
                    )
                    (of) 
                    (case_of_branch 
                        (pattern 
                        (list_pattern 
                        (left_square_bracket) 
                        (pattern 
                        (lower_pattern 
                        (lower_case_identifier))) 
                        (right_square_bracket))) 
                        (arrow) 
                        (function_call_expr 
                            (value_expr 
                            (value_qid 
                            (upper_case_identifier) 
                            (dot) 
                            (lower_case_identifier))) 
                            (value_expr (value_qid (lower_case_identifier))) 
                            (value_expr (value_qid (lower_case_identifier)))
                        )
                    )
                    (case_of_branch 
                        (pattern 
                            (anything_pattern (underscore))
                        ) 
                        (arrow) (value_expr (upper_case_qid (upper_case_identifier)))
                    )
                )
            )
        )
    )
) 

