use std::collections::VecDeque;
#[derive(Debug, Clone, Hash)]
pub struct Lfsr {
state: VecDeque<u8>,
taps: Vec<u8>,
}
impl Lfsr {
pub fn new(taps: Vec<u8>) -> Lfsr {
Lfsr {
state: VecDeque::new(),
taps: taps.into_iter().map(|t| t-1).collect(),
}
}
pub fn set_key(&mut self, key:VecDeque<u8>) {
self.state = key;
}
fn _carry(&self) -> u8{
self.taps.iter().map(|&i| self.state[i as usize]).sum::<u8>() & 1
}
pub fn clock(&mut self) -> u8 {
self.state.push_front(self._carry());
self.state.pop_back().unwrap()
}
}