use crate::file_format::SymbolStack;
pub(super) fn encode(data: &[u8]) -> Vec<u8> {
let mut symbols: Vec<u8> = (0..=255).collect();
let mut output = vec![];
for byte in data {
let (index, _) = symbols
.iter()
.enumerate()
.find(|(_, value)| *value == byte)
.expect("Every possible byte should be here");
output.push(index as u8);
let value = symbols.remove(index);
symbols.insert(0, value);
}
output
}
pub(super) fn decode(data: &[u8], SymbolStack(mut symbols): SymbolStack) -> Vec<u8> {
let mut output = vec![];
for index in data {
let index = *index as usize;
let value = symbols[index];
output.push(value);
let value = symbols.remove(index);
symbols.insert(0, value);
}
output
}
#[cfg(test)]
mod tests {
use super::*;
mod test_decode {
use super::*;
#[test]
fn banana() {
let symbol_stack = SymbolStack((0..=255).collect());
let input = [1, 1, 13, 1, 1, 1];
let decoded = decode(&input, symbol_stack);
assert_eq!(decoded, [1, 0, 13, 0, 13, 0]);
}
#[test]
fn input_255() {
let symbol_stack = SymbolStack((0..=255).collect());
let input = [255];
let decoded = decode(&input, symbol_stack);
assert_eq!(decoded, [255]);
}
}
mod test_encode {
use super::*;
#[test]
fn banana() {
let input = [1, 0, 13, 0, 13, 0];
let encoded = encode(&input);
assert_eq!(encoded, [1, 1, 13, 1, 1, 1]);
}
#[test]
fn input_255() {
let input = [255];
let encoded = encode(&input);
assert_eq!(encoded, [255]);
}
}
}