block-id 0.1.2

Library for generating opaque, unique, and short string values from (unsigned) integers
Documentation
pub fn add_mod(lhs: u8, rhs: u8, base: u8) -> u8 {
    let mut result = lhs.wrapping_add(rhs);

    if result < lhs {
        result = result.wrapping_sub(base);
    }

    result % base
}

pub fn sub_mod(lhs: u8, rhs: u8, base: u8) -> u8 {
    let mut result = lhs.wrapping_sub(rhs);

    if result > lhs {
        result = result.wrapping_add(base);
    }

    result % base
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_add_mod() {
        assert_eq!(1, add_mod(4, 5, 8));

        assert_eq!(4, add_mod(200, 58, 254));
        assert_eq!(5, add_mod(200, 58, 253));

        assert_eq!(8, add_mod(200, 58, 250));

        assert_eq!(222, add_mod(233, 233, 244));
    }

    #[test]
    fn test_sub_mod() {
        assert_eq!(1, sub_mod(6, 5, 10));
        assert_eq!(9, sub_mod(5, 6, 10));
    }
}