fixity 0.0.1

Storage for structured and unstructured data backed by an immutable storage engine
use fbuzhash::BuzHash;

const DEFAULT_PATTERN: u32 = (1 << 12) - 1;
const DEFAULT_WINDOW_SIZE: u32 = 67;

#[derive(Copy, Clone)]
pub struct Config {
    pub pattern: u32,
    pub window_size: u32,
}
impl Config {
    pub fn with_pattern(pattern: u32) -> Self {
        Self {
            pattern,
            window_size: DEFAULT_WINDOW_SIZE,
        }
    }
}
impl Default for Config {
    fn default() -> Self {
        Self {
            pattern: DEFAULT_PATTERN,
            window_size: DEFAULT_WINDOW_SIZE,
        }
    }
}
pub struct Roller {
    pattern: u32,
    buzhash: BuzHash,
}
impl Roller {
    pub fn new() -> Self {
        Self::with_config(Config::default())
    }
    pub fn with_config(
        Config {
            pattern,
            window_size,
        }: Config,
    ) -> Self {
        Self {
            pattern,
            buzhash: BuzHash::new(window_size),
        }
    }
    pub fn roll_byte(&mut self, b: u8) -> bool {
        self.buzhash.hash_byte(b) & self.pattern == self.pattern
    }
    pub fn roll_bytes(&mut self, bytes: &[u8]) -> bool {
        for &b in bytes {
            if self.roll_byte(b) {
                return true;
            }
        }
        false
    }
}
impl Default for Roller {
    fn default() -> Self {
        Self::new()
    }
}