///|
pub fn VerifiedFuseFilter::union(
  self : VerifiedFuseFilter,
  other : VerifiedFuseFilter,
) -> Result[VerifiedFuseFilter, FuseError] {
  let values : Array[Int] = []
  let mut left = 0
  let mut right = 0
  while left < self.sorted_hashes.length() ||
        right < other.sorted_hashes.length() {
    if right == other.sorted_hashes.length() ||
      (
        left < self.sorted_hashes.length() &&
        self.sorted_hashes[left] < other.sorted_hashes[right]
      ) {
      values.push(self.sorted_hashes[left])
      left = left + 1
    } else if left == self.sorted_hashes.length() ||
      other.sorted_hashes[right] < self.sorted_hashes[left] {
      values.push(other.sorted_hashes[right])
      right = right + 1
    } else {
      values.push(self.sorted_hashes[left])
      left = left + 1
      right = right + 1
    }
  }
  VerifiedFuseFilter::build(values)
}

///|
pub fn VerifiedFuseFilter::intersection(
  self : VerifiedFuseFilter,
  other : VerifiedFuseFilter,
) -> Result[VerifiedFuseFilter, FuseError] {
  let values : Array[Int] = []
  let mut left = 0
  let mut right = 0
  while left < self.sorted_hashes.length() &&
        right < other.sorted_hashes.length() {
    let left_value = self.sorted_hashes[left]
    let right_value = other.sorted_hashes[right]
    if left_value == right_value {
      values.push(left_value)
      left = left + 1
      right = right + 1
    } else if left_value < right_value {
      left = left + 1
    } else {
      right = right + 1
    }
  }
  VerifiedFuseFilter::build(values)
}

///|
pub fn VerifiedFuseFilter::difference(
  self : VerifiedFuseFilter,
  other : VerifiedFuseFilter,
) -> Result[VerifiedFuseFilter, FuseError] {
  let values : Array[Int] = []
  let mut left = 0
  let mut right = 0
  while left < self.sorted_hashes.length() {
    if right == other.sorted_hashes.length() {
      values.push(self.sorted_hashes[left])
      left = left + 1
    } else if self.sorted_hashes[left] == other.sorted_hashes[right] {
      left = left + 1
      right = right + 1
    } else if self.sorted_hashes[left] < other.sorted_hashes[right] {
      values.push(self.sorted_hashes[left])
      left = left + 1
    } else {
      right = right + 1
    }
  }
  VerifiedFuseFilter::build(values)
}

///|
pub fn VerifiedFuseFilter::symmetric_difference(
  self : VerifiedFuseFilter,
  other : VerifiedFuseFilter,
) -> Result[VerifiedFuseFilter, FuseError] {
  let values : Array[Int] = []
  let mut left = 0
  let mut right = 0
  while left < self.sorted_hashes.length() ||
        right < other.sorted_hashes.length() {
    if right == other.sorted_hashes.length() ||
      (
        left < self.sorted_hashes.length() &&
        self.sorted_hashes[left] < other.sorted_hashes[right]
      ) {
      values.push(self.sorted_hashes[left])
      left = left + 1
    } else if left == self.sorted_hashes.length() ||
      other.sorted_hashes[right] < self.sorted_hashes[left] {
      values.push(other.sorted_hashes[right])
      right = right + 1
    } else {
      left = left + 1
      right = right + 1
    }
  }
  VerifiedFuseFilter::build(values)
}