/*
pub fn diff<D: diffs::Diff>(window: usize, a: &[u8], b: &[u8], d: D)
where
    D::Error: std::fmt::Debug,
{
    let a_h = make_old_chunks(window, a);
    let bb = make_new_chunks(window, &a_h, b);
    // Make a dummy vector (because `std::ops::Index` wants a borrow).
    let mut aa = Vec::with_capacity(a.len() / window + 1);
    for pos in 0..(a.len() + window - 1) / window {
        aa.push(pos)
    }
    diffs::myers::diff(
        &mut W {
            d,
            window,
            old_len: a.len(),
            a: &aa,
            b: &bb,
        },
        &aa,
        0,
        aa.len(),
        &bb,
        0,
        bb.len(),
    )
    .unwrap();
}
impl Chunk {
    fn start(&self) -> usize {
        match *self {
            Chunk::Old { start, .. } => start,
            Chunk::New { start, .. } => start,
        }
    }
}
impl PartialEq<usize> for Chunk {
    fn eq(&self, b: &usize) -> bool {
        if let Chunk::Old { old_pos, .. } = *self {
            old_pos == *b
        } else {
            false
        }
    }
}
#[derive(Debug)]
struct W<'a, D> {
    d: D,
    window: usize,
    old_len: usize,
    a: &'a [usize],
    b: &'a [Chunk],
}
impl<'a, D: diffs::Diff> diffs::Diff for W<'a, D>
where
    D::Error: std::fmt::Debug,
{
    type Error = D::Error;
    fn equal(&mut self, old: usize, new: usize, len: usize) -> Result<(), Self::Error> {
        let old = old * self.window;
        let new = self.b[new].start();
        let len = (len * self.window).min(self.old_len - old);
        self.d.equal(old, new, len)
    }
    fn delete(&mut self, old: usize, len: usize, new: usize) -> Result<(), Self::Error> {
        let old = old * self.window;
        let new = self.b[new].start();
        let len = (len * self.window).min(self.old_len - old);
        self.d.delete(old, len, new)
    }
    fn insert(&mut self, old: usize, new: usize, new_len: usize) -> Result<(), Self::Error> {
        let old = old * self.window;
        let new = self.b[new].start();
        let mut new_len_ = 0;
        for b in &self.b[new .. new + new_len] {
            match b {
                Chunk::Old { start, .. } => {
                    new_len_ += self.window.min(self.old_len - start)
                }
                Chunk::New { len, .. } => {
                    new_len_ += len
                }
            }
        }
        self.d.insert(old, new, new_len_)
    }
    fn replace(
        &mut self,
        old: usize,
        old_len: usize,
        new: usize,
        new_len: usize,
    ) -> Result<(), Self::Error> {
        let old = old * self.window;
        let old_len = (old_len * self.window).min(self.old_len - old);
        let new = self.b[new].start();
        let mut new_len_ = 0;
        for b in &self.b[new .. new + new_len] {
            match b {
                Chunk::Old { start, .. } => {
                    new_len_ += self.window.min(self.old_len - start)
                }
                Chunk::New { len, .. } => {
                    new_len_ += len
                }
            }
        }
        self.d.replace(old, old_len, new, new_len_)
    }
    fn finish(&mut self) -> Result<(), Self::Error> {
        self.d.finish()
    }
}
 */