nekolib/utils/
op_roll_hash.rs1use super::super::traits::binop;
4
5use std::fmt::Debug;
6
7use binop::{Associative, Identity, Magma};
8
9#[derive(Clone, Copy, Debug, Eq, PartialEq)]
32pub enum OpRollHash<const B: u64> {
33 OpRollHashV,
34}
35pub use OpRollHash::OpRollHashV;
36
37impl<const B: u64> Default for OpRollHash<B> {
38 fn default() -> Self { OpRollHashV }
39}
40
41impl<const B: u64> Magma for OpRollHash<B> {
42 type Set = (u64, u64);
43 fn op(&self, (hx, lx): Self::Set, (hy, ly): Self::Set) -> Self::Set {
44 ((hx * ly + hy) % B, (lx * ly) % B)
45 }
46}
47
48impl<const B: u64> Identity for OpRollHash<B> {
49 fn id(&self) -> Self::Set { (0, 1) }
50}
51
52impl<const B: u64> Associative for OpRollHash<B> {}
53
54impl<const B: u64> OpRollHash<B> {
55 #[must_use]
56 pub fn value_of(&self, s: &str) -> <Self as Magma>::Set {
57 s.chars().fold((0, 0), |acc, x| self.op(acc, (x as u64, B)))
58 }
59}