///|
pub fn FuseBuilder::new() -> FuseBuilder {
  { hashes: [] }
}

///|
pub fn FuseBuilder::with_capacity(_capacity : Int) -> FuseBuilder {
  // ponytail: MoonBit Array has no reserve API; keep one allocation path.
  let hashes : Array[Int] = []
  { hashes, }
}

///|
pub fn FuseBuilder::add(
  self : FuseBuilder,
  hash : Int,
) -> Result[Unit, FuseError] {
  if hash < 0 {
    return Err(NegativeHash(hash))
  }
  self.hashes.push(hash)
  Ok(())
}

///|
pub fn FuseBuilder::add_all(
  self : FuseBuilder,
  hashes : Array[Int],
) -> Result[Unit, FuseError] {
  for hash in hashes {
    match self.add(hash) {
      Ok(_) => ()
      Err(error) => return Err(error)
    }
  }
  Ok(())
}

///|
pub fn FuseBuilder::len(self : FuseBuilder) -> Int {
  self.hashes.length()
}

///|
pub fn FuseBuilder::build(
  self : FuseBuilder,
) -> Result[BinaryFuseFilter, FuseError] {
  BinaryFuseFilter::build(self.hashes)
}

///|
pub fn FuseBuilder::build16(
  self : FuseBuilder,
) -> Result[BinaryFuseFilter, FuseError] {
  BinaryFuseFilter::build16(self.hashes)
}

///|
pub fn FuseBuilder::clear(self : FuseBuilder) -> Unit {
  self.hashes.clear()
}