///|
/// A deterministic, sorted label set.
pub(all) struct LabelSet {
  labels : Array[(String, String)]
} derive(Eq, @debug.Debug)

///|
pub fn LabelSet::empty() -> LabelSet {
  { labels: [], }
}

///|
pub fn LabelSet::new(labels : Array[(String, String)]) -> LabelSet {
  let merged : Array[(String, String)] = []
  for pair in labels {
    let mut replaced = false
    for i in 0.. left.0.compare(right.0))
  { labels: merged, }
}

///|
pub fn LabelSet::get(self : LabelSet, name : StringView) -> String? {
  let key = name.to_owned()
  for pair in self.labels {
    if pair.0 == key {
      return Some(pair.1)
    }
  }
  None
}

///|
pub fn LabelSet::contains(self : LabelSet, name : StringView) -> Bool {
  self.get(name) is Some(_)
}

///|
pub fn LabelSet::set(
  self : LabelSet,
  name : String,
  value : String,
) -> LabelSet {
  let next : Array[(String, String)] = []
  for pair in self.labels {
    if pair.0 != name {
      next.push(pair)
    }
  }
  next.push((name, value))
  LabelSet::new(next)
}

///|
pub fn LabelSet::remove(self : LabelSet, name : StringView) -> LabelSet {
  let key = name.to_owned()
  let next : Array[(String, String)] = []
  for pair in self.labels {
    if pair.0 != key {
      next.push(pair)
    }
  }
  { labels: next, }
}

///|
pub fn LabelSet::without(self : LabelSet, names : Array[String]) -> LabelSet {
  let next : Array[(String, String)] = []
  for pair in self.labels {
    let mut remove = false
    for name in names {
      if pair.0 == name {
        remove = true
        break
      }
    }
    if !remove {
      next.push(pair)
    }
  }
  { labels: next, }
}

///|
pub fn LabelSet::only(self : LabelSet, names : Array[String]) -> LabelSet {
  let next : Array[(String, String)] = []
  for pair in self.labels {
    let mut keep = false
    for name in names {
      if pair.0 == name {
        keep = true
        break
      }
    }
    if keep {
      next.push(pair)
    }
  }
  { labels: next, }
}

///|
pub fn LabelSet::to_string(self : LabelSet) -> String {
  let builder = StringBuilder()
  builder.write_string("{")
  for i, pair in self.labels {
    if i > 0 {
      builder.write_string(",")
    }
    builder.write_string(pair.0)
    builder.write_string("=\"")
    builder.write_string(pair.1)
    builder.write_string("\"")
  }
  builder.write_string("}")
  builder.to_string()
}