///|
/// Result of comparing two environment maps.
pub struct DiffResult {
  added : Array[String]
  removed : Array[String]
  changed : Array[String]
}

///|
/// Compare two maps and return which keys were added, removed, or changed.
///
/// - `added`: keys present in `other` but not in `base`
/// - `removed`: keys present in `base` but not in `other`
/// - `changed`: keys present in both but with different values
pub fn diff(
  base : Map[String, String],
  other : Map[String, String],
) -> DiffResult {
  let added : Array[String] = []
  let removed : Array[String] = []
  let changed : Array[String] = []

  for k, v in base {
    if other.contains(k) {
      if v != other[k] {
        changed.push(k)
      }
    } else {
      removed.push(k)
    }
  }

  for k, _ in other {
    if !base.contains(k) {
      added.push(k)
    }
  }

  { added, removed, changed }
}