///|
/// A PartiQL tuple: (name, value) pairs. Order is kept for output only;
/// duplicate names are allowed; no value is MISSING.
pub struct Tuple {
  priv fields : Array[(String, Value)]
} derive(Debug)

///|
/// Builds a tuple. Pairs whose value is MISSING are dropped.
pub fn Tuple::new(fields : Array[(String, Value)]) -> Tuple {
  { fields: fields.filter(pair => !(pair.1 is Missing)), }
}

///|
pub fn Tuple::fields(self : Tuple) -> ArrayView[(String, Value)] {
  self.fields[:]
}

///|
pub fn Tuple::length(self : Tuple) -> Int {
  self.fields.length()
}

///|
/// The values of the attributes named `name` (case-sensitive).
pub fn Tuple::get_all(self : Tuple, name : String) -> Array[Value] {
  self.fields.filter(pair => pair.0 == name).map(pair => pair.1)
}