///|
/// Shared exact-bound overrides for LinearLocator. Values retain borrowed, possibly strided tick views.
pub struct LinearLocatorPresets {
  priv entries : Array[((Double, Double), TickValues)]
}

///|
pub fn LinearLocatorPresets::new() -> LinearLocatorPresets {
  { entries: [], }
}

///|
/// Replace an equal key in place, or append a new key. NaN keys do not compare equal.
pub fn LinearLocatorPresets::set(
  self : LinearLocatorPresets,
  lower : Double,
  upper : Double,
  values : Array[Double],
) -> Unit {
  self.set_view(lower, upper, TickValues::from_array(values))
}

///|
/// Store a borrowed tick view, preserving its underlying buffer and stride.
pub fn LinearLocatorPresets::set_view(
  self : LinearLocatorPresets,
  lower : Double,
  upper : Double,
  values : TickValues,
) -> Unit {
  for index, (key, _) in self.entries {
    if key.0 == lower && key.1 == upper {
      self.entries[index] = ((lower, upper), values)
      return
    }
  }
  self.entries.push(((lower, upper), values))
}

///|
/// Return the original tick view associated with an exact pair of bounds.
pub fn LinearLocatorPresets::get(
  self : LinearLocatorPresets,
  lower : Double,
  upper : Double,
) -> TickValues? {
  for (key, values) in self.entries {
    if key.0 == lower && key.1 == upper {
      return Some(values)
    }
  }
  None
}

///|
pub fn LinearLocatorPresets::length(self : LinearLocatorPresets) -> Int32 {
  self.entries.length()
}

///|
pub fn LinearLocatorPresets::clear(self : LinearLocatorPresets) -> Unit {
  self.entries.clear()
}