program main
  fn narrow(value: f64) -> (result i32 i32)
    call std.num.f64_to_i32_result : (result i32 i32)
      var value : f64
  fn zero_ok() -> (result i32 i32)
    call narrow : (result i32 i32)
      binary - : f64
        float 2.5 : f64
        float 2.5 : f64
  fn negative_ok() -> (result i32 i32)
    call narrow : (result i32 i32)
      binary - : f64
        float 1 : f64
        float 13 : f64
  fn fractional_err() -> (result i32 i32)
    call narrow : (result i32 i32)
      binary / : f64
        float 7 : f64
        float 2 : f64
  fn above_high_err() -> (result i32 i32)
    call narrow : (result i32 i32)
      float 2147483648 : f64
  fn main() -> i32
    local let value : unit
      call negative_ok : (result i32 i32)
    if : i32
      std.result.is_ok : bool
        var value : (result i32 i32)
      if : i32
        binary = : bool
          std.result.unwrap_ok : i32
            var value : (result i32 i32)
          int -12 : i32
        int 0 : i32
        int 1 : i32
      std.result.unwrap_err : i32
        var value : (result i32 i32)
  test "f64 zero narrows to i32"
    local let value : unit
      call zero_ok : (result i32 i32)
    if : bool
      std.result.is_ok : bool
        var value : (result i32 i32)
      binary = : bool
        std.result.unwrap_ok : i32
          var value : (result i32 i32)
        int 0 : i32
      bool false : bool
  test "negative f64 narrows to i32"
    local let value : unit
      call negative_ok : (result i32 i32)
    if : bool
      std.result.is_ok : bool
        var value : (result i32 i32)
      binary = : bool
        std.result.unwrap_ok : i32
          var value : (result i32 i32)
        int -12 : i32
      bool false : bool
  test "fractional f64 returns err"
    local let value : unit
      call fractional_err : (result i32 i32)
    if : bool
      std.result.is_err : bool
        var value : (result i32 i32)
      binary = : bool
        std.result.unwrap_err : i32
          var value : (result i32 i32)
        int 1 : i32
      bool false : bool
  test "above i32 range f64 returns err"
    local let value : unit
      call above_high_err : (result i32 i32)
    if : bool
      std.result.is_err : bool
        var value : (result i32 i32)
      binary = : bool
        std.result.unwrap_err : i32
          var value : (result i32 i32)
        int 1 : i32
      bool false : bool
