///|
/// 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)
}