///|
/// Combine recognition evidence while preserving the originating model name.
pub fn digest_many(
  dna : Dna,
  enzymes : Array[Enzyme],
  policy? : AmbiguityPolicy = CertainOnly,
) -> Digest raise RestrictError {
  if enzymes.length() > 32 {
    raise LimitExceeded("ENZYME_MAX_32")
  }
  let names : Map[String, Bool] = Map([])
  let mut work = 0
  for e in enzymes {
    if names.contains(e.name) {
      raise InvalidInput("DUPLICATE_ENZYME_NAME")
    }
    names[e.name] = true
    work = work + dna.length() * e.motif.length()
    if work > 20000000 {
      raise LimitExceeded("BATCH_SCAN_WORK")
    }
  }
  let sites : Array[Site] = []
  for e in enzymes {
    for site in scan(dna, e) {
      if sites.length() >= 10000 {
        raise LimitExceeded("BATCH_SITE_MAX_10000")
      }
      sites.push(site)
    }
  }
  sites.sort_by((s1, s2) => {
    let position = s1.start.compare(s2.start)
    if position != 0 {
      position
    } else {
      s1.enzyme.compare(s2.enzyme)
    }
  })
  partition(dna, selected_cuts(sites, policy), sites, policy)
}