///|
/// Linear oracle: allocates results, performs no tree pruning or ID validation.
/// Duplicate input IDs remain duplicated. Intended for verification and tiny inputs.
pub fn scan_aabb(input : ArrayView[Entry], query : @geom.Aabb) -> Array[UInt32] {
  let result : Array[UInt32] = []
  for entry in input {
    if query.intersects(entry.bounds) {
      result.push(entry.id)
    }
  }
  result
}

///|
pub fn scan_ray_candidates(
  input : ArrayView[Entry],
  query : @geom.Ray,
) -> Array[UInt32] {
  let result : Array[UInt32] = []
  for entry in input {
    if query.intersects(entry.bounds) {
      result.push(entry.id)
    }
  }
  result
}