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 pub fn new(current: &[u8], replacement: &'valid [u8]) -> Self {
42 let mut old = current.into_iter();
43 let mut new = replacement.into_iter();
44 for index in 0.. {return if old.next() != new.next() {Diff {
45 remove: current.len() - index,
46 write: &replacement[index..]
47 }} else {continue}}
48 unreachable!();
49 }
50}
51
52impl<'valid> Into<Vec<u8>> for Diff<'valid> {
54 fn into(self) -> Vec<u8> {
55 let mut sequence = Vec::new();
56 sequence.extend(ERASE.repeat(self.remove));
57 sequence.extend(self.write);
58 return sequence;
59 }
60}