1#![no_std]
7
8extern crate alloc;
10
11#[cfg(test)]
13mod tests;
14
15use alloc::vec::Vec;
17
18
19pub struct Diff<'valid> {
25 remove: usize,
26 write: &'valid [u8]
27}
28
29const ERASE: [u8; 7] = [b'\x1B', b'[', b'D', b' ', b'\x1B', b'[', b'D'];
31
32impl<'valid> Diff<'valid> {
34 #[inline]
35 pub fn new(current: &[u8], replacement: &'valid [u8]) -> Self {
36 let mut old = current.into_iter();
37 let mut new = replacement.into_iter();
38 for index in 0.. {return if old.next() != new.next() {Diff {
39 remove: current.len() - index,
40 write: &replacement[index..]
41 }} else {continue}}
42 unreachable!();
43 }
44}
45
46impl<'valid> Into<Vec<u8>> for Diff<'valid> {
48 #[inline]
49 fn into(self) -> Vec<u8> {
50 let mut sequence = Vec::new();
51 sequence.extend(ERASE.repeat(self.remove));
52 sequence.extend(self.write);
53 return sequence;
54 }
55}