1#![no_std]
7
8#![feature(test)]
10
11extern crate alloc;
13extern crate test;
14
15#[cfg(test)]
17mod benches;
18#[cfg(test)]
19mod tests;
20
21use alloc::vec::Vec;
23
24
25#[derive(Debug, Clone, Copy)]
31pub struct Diff<'valid> {
32 remove: usize,
33 write: &'valid [u8]
34}
35
36const ERASE: [u8; 7] = [b'\x1B', b'[', b'D', b' ', b'\x1B', b'[', b'D'];
38
39impl<'valid> Diff<'valid> {
41 #[inline]
42 pub fn new(current: &[u8], replacement: &'valid [u8]) -> Self {
43 let mut old = current.into_iter();
44 let mut new = replacement.into_iter();
45 for index in 0.. {return if old.next() != new.next() {Diff {
46 remove: current.len() - index,
47 write: &replacement[index..]
48 }} else {continue}}
49 unreachable!();
50 }
51}
52
53impl<'valid> Into<Vec<u8>> for Diff<'valid> {
55 #[inline]
56 fn into(self) -> Vec<u8> {
57 let mut sequence = Vec::new();
58 sequence.extend(ERASE.repeat(self.remove));
59 sequence.extend(self.write);
60 return sequence;
61 }
62}