///|
/// ARC targets can reuse an unaliased backing buffer while constructing a new
/// result array. The pool retains at most the most recent exact result.
#cfg(any(target="native", target="wasm"))
priv struct ExactResults {
  mut cached : Array[Suggestion]?
}

///|
#cfg(any(target="native", target="wasm"))
fn ExactResults::new() -> ExactResults {
  { cached: None, }
}

///|
#cfg(any(target="native", target="wasm"))
fn ExactResults::single(
  self : ExactResults,
  suggestion : Suggestion,
) -> Array[Suggestion] {
  let previous = self.cached
  self.cached = None
  let result = match previous {
    Some(previous) => renew_exact_result(previous, suggestion)
    None => [suggestion]
  }
  self.cached = Some(result)
  result
}

///|
/// Consume the old array before converting its view. The core conversion can
/// reuse the buffer only if no surviving array, view, or iterator owns it;
/// otherwise it copies. This preserves the public result's mutable semantics.
#cfg(any(target="native", target="wasm"))
#owned(previous)
fn renew_exact_result(
  previous : Array[Suggestion],
  suggestion : Suggestion,
) -> Array[Suggestion] {
  if previous.length() != 1 {
    return [suggestion]
  }
  let result = previous[:].to_owned()
  result[0] = suggestion
  result
}

///|
#cfg(not(any(target="native", target="wasm")))
priv enum ExactResults {
  Fresh
}

///|
#cfg(not(any(target="native", target="wasm")))
fn ExactResults::new() -> ExactResults {
  Fresh
}

///|
#cfg(not(any(target="native", target="wasm")))
fn ExactResults::single(
  _self : ExactResults,
  suggestion : Suggestion,
) -> Array[Suggestion] {
  [suggestion]
}