pub fn encode_move_to_front<T: Eq + Clone>(input: &[T], ordering: &mut Vec<T>) -> Vec<usize> {
let mut result = Vec::with_capacity(input.len());
for el in input {
let idx = ordering
.iter()
.position(|x| x == el)
.expect("Element not found in ordering");
result.push(idx);
ordering.remove(idx);
ordering.insert(0, el.clone());
}
return result;
}
pub fn decode_move_to_front<T: Eq + Clone>(input: &[usize], ordering: &mut Vec<T>) -> Vec<T> {
let mut result = Vec::with_capacity(input.len());
for idx in input {
let el = ordering[*idx].clone();
result.push(el.clone());
ordering.remove(*idx);
ordering.insert(0, el);
}
return result;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hello() {
let mut ordering = vec!['e', 'h', 'l', 'o'];
let input = vec!['h', 'e', 'l', 'l', 'o'];
let encoded = encode_move_to_front(&input, &mut ordering);
assert_eq!(encoded, vec![1, 1, 2, 0, 3]);
}
#[test]
fn test_hello_decode() {
let mut ordering = vec!['e', 'h', 'l', 'o'];
let input = vec![1, 1, 2, 0, 3];
let decoded = decode_move_to_front(&input, &mut ordering);
assert_eq!(decoded, vec!['h', 'e', 'l', 'l', 'o']);
}
}