///|
priv struct ResolvedTouchPoints {
  touches : Array[@core.TouchPoint]
  saw_native_touch : Bool
}

///|
fn has_left_mouse_button_pressed(pressed_mouse_buttons : Array[Int]) -> Bool {
  let mut found = false
  for button in pressed_mouse_buttons {
    if button == 0 {
      found = true
    }
  }
  found
}

///|
fn resolve_touch_points_with_mouse_fallback(
  touches : Array[@core.TouchPoint],
  pressed_mouse_buttons : Array[Int],
  cursor_x : Double,
  cursor_y : Double,
  saw_native_touch : Bool,
  fallback_enabled : Bool,
) -> ResolvedTouchPoints {
  // Filter out Indirect touches (macOS trackpad surface touches)
  let direct_touches : Array[@core.TouchPoint] = []
  for touch in touches {
    if @core.touch_source_to_int(touch.source) != 1 {
      direct_touches.push(touch)
    }
  }
  if direct_touches.length() > 0 {
    { touches: direct_touches, saw_native_touch: true, }
  } else if saw_native_touch {
    { touches: direct_touches, saw_native_touch, }
  } else if !fallback_enabled {
    { touches: direct_touches, saw_native_touch: false, }
  } else {
    let resolved_touches = direct_touches
    if has_left_mouse_button_pressed(pressed_mouse_buttons) {
      resolved_touches.push(
        @core.new_touch_point_with_source(
          0,
          cursor_x,
          cursor_y,
          @core.touch_source_from_int(2),
        ),
      )
    }
    { touches: resolved_touches, saw_native_touch: false, }
  }
}