program main
  fn maybe_value(value: i32) -> (option i32)
    some i32
      var value
  fn maybe_empty() -> (option i32)
    none i32
  fn maybe_wide_value(value: i64) -> (option i64)
    some i64
      var value
  fn maybe_wide_empty() -> (option i64)
    none i64
  fn maybe_float_value(value: f64) -> (option f64)
    some f64
      var value
  fn maybe_float_empty() -> (option f64)
    none f64
  fn maybe_flag_value(value: bool) -> (option bool)
    some bool
      var value
  fn maybe_flag_empty() -> (option bool)
    none bool
  fn maybe_string_value(value: string) -> (option string)
    some string
      var value
  fn maybe_string_empty() -> (option string)
    none string
  fn result_ok_value(value: i32) -> (result i32 i32)
    ok i32 i32
      var value
  fn result_err_value(code: i32) -> (result i32 i32)
    err i32 i32
      var code
  fn option_value_or(value: (option i32), fallback: i32) -> i32
    match
      subject
        var value
      arm some payload
        var payload
      arm none
        var fallback
  fn option_bump_or_zero(value: (option i32)) -> i32
    match
      subject
        var value
      arm some payload
        local let bumped: i32
          binary +
            var payload
            int 1
        var bumped
      arm none
        int 0
  fn option_wide_value_or(value: (option i64), fallback: i64) -> i64
    match
      subject
        var value
      arm some payload
        var payload
      arm none
        var fallback
  fn option_wide_bump_or_zero(value: (option i64)) -> i64
    match
      subject
        var value
      arm some payload
        local let bumped: i64
          binary +
            var payload
            i64 1
        var bumped
      arm none
        i64 0
  fn option_float_value_or(value: (option f64), fallback: f64) -> f64
    match
      subject
        var value
      arm some payload
        var payload
      arm none
        var fallback
  fn option_float_bump_or_zero(value: (option f64)) -> f64
    match
      subject
        var value
      arm some payload
        local let bumped: f64
          binary +
            var payload
            float 1
        var bumped
      arm none
        float 0
  fn option_flag_value_or(value: (option bool), fallback: bool) -> bool
    match
      subject
        var value
      arm some payload
        var payload
      arm none
        var fallback
  fn option_flag_selected_or(value: (option bool), fallback: bool) -> bool
    match
      subject
        var value
      arm some payload
        if
          var payload
          bool true
          bool false
        var payload
      arm none
        var fallback
  fn option_string_value_or(value: (option string), fallback: string) -> string
    match
      subject
        var value
      arm some payload
        var payload
      arm none
        var fallback
  fn option_string_selected_or(value: (option string), fallback: string) -> string
    match
      subject
        var value
      arm some payload
        local let chosen: string
          var payload
        var chosen
      arm none
        var fallback
  fn result_value_or_code(value: (result i32 i32)) -> i32
    match
      subject
        var value
      arm ok payload
        var payload
      arm err code
        var code
  fn result_score(value: (result i32 i32)) -> i32
    match
      subject
        var value
      arm ok payload
        binary +
          var payload
          int 10
      arm err code
        var code
  fn main() -> i32
    int 0
  test "option match some payload"
    binary =
      call option_value_or
        call maybe_value
          int 42
        int 0
      int 42
  test "option match none fallback"
    binary =
      call option_value_or
        call maybe_empty
        int 7
      int 7
  test "option match multi expression arm"
    binary =
      call option_bump_or_zero
        call maybe_value
          int 8
      int 9
  test "option i64 match some payload"
    binary =
      call option_wide_value_or
        call maybe_wide_value
          i64 2147483648
        i64 0
      i64 2147483648
  test "option i64 match none fallback"
    binary =
      call option_wide_value_or
        call maybe_wide_empty
        i64 7
      i64 7
  test "option i64 match multi expression arm"
    binary =
      call option_wide_bump_or_zero
        call maybe_wide_value
          i64 8
      i64 9
  test "option f64 match some payload"
    binary =
      call option_float_value_or
        call maybe_float_value
          float 42.5
        float 0
      float 42.5
  test "option f64 match none fallback"
    binary =
      call option_float_value_or
        call maybe_float_empty
        float 7
      float 7
  test "option f64 match multi expression arm"
    binary =
      call option_float_bump_or_zero
        call maybe_float_value
          float 8.5
      float 9.5
  test "option bool match some payload"
    call option_flag_value_or
      call maybe_flag_value
        bool true
      bool false
  test "option bool match none fallback"
    call option_flag_value_or
      call maybe_flag_empty
      bool true
  test "option bool match multi expression arm"
    call option_flag_selected_or
      call maybe_flag_value
        bool true
      bool false
  test "option string match some payload"
    binary =
      call option_string_value_or
        call maybe_string_value
          string "slovo"
        string "fallback"
      string "slovo"
  test "option string match none fallback"
    binary =
      call option_string_value_or
        call maybe_string_empty
        string "fallback"
      string "fallback"
  test "option string match multi expression arm"
    binary =
      call option_string_selected_or
        call maybe_string_value
          string "oak"
        string "fallback"
      string "oak"
  test "result match ok payload"
    binary =
      call result_value_or_code
        call result_ok_value
          int 30
      int 30
  test "result match err payload"
    binary =
      call result_value_or_code
        call result_err_value
          int 5
      int 5
  test "result match computed arm"
    binary =
      call result_score
        call result_ok_value
          int 2
      int 12
