#[inline]
pub fn shrink_chain<T: Clone>(mut chain: Vec<T>, is_failure: impl Fn(&[T]) -> bool) -> Vec<T> {
if !is_failure(&chain) {
return chain;
}
let mut span = chain.len().saturating_div(2).max(1);
while span > 0 && chain.len() > 1 {
let mut removed = false;
let mut start = 0;
while start + span <= chain.len() {
let mut trial = chain.clone();
trial.drain(start..start + span);
if !trial.is_empty() && is_failure(&trial) {
chain = trial;
removed = true;
} else {
start += 1;
}
}
if !removed {
span /= 2;
}
}
chain
}