use-algebra 0.0.3

Utility-first finite algebra law helpers for RustUse
Documentation
use use_algebra::{
    has_inverses, identity_element, is_abelian_group, is_associative, is_closed_under,
    is_commutative, is_distributive_over, is_group, is_monoid, is_ring,
};

#[test]
fn direct_algebra_usage_covers_group_and_ring_checks() {
    let residues = [0_u8, 1, 2];
    let add_mod_3 = |left, right| (left + right) % 3;
    let mul_mod_3 = |left, right| (left * right) % 3;

    assert!(is_closed_under(&residues, add_mod_3));
    assert!(is_associative(&residues, add_mod_3));
    assert!(is_commutative(&residues, add_mod_3));
    assert_eq!(identity_element(&residues, add_mod_3), Some(0));
    assert!(has_inverses(&residues, add_mod_3, 0));
    assert!(is_monoid(&residues, add_mod_3));
    assert!(is_group(&residues, add_mod_3));
    assert!(is_abelian_group(&residues, add_mod_3));
    assert!(is_distributive_over(&residues, mul_mod_3, add_mod_3));
    assert!(is_ring(&residues, add_mod_3, mul_mod_3));
}

#[test]
fn algebra_usage_rejects_structures_that_fail_the_laws() {
    let booleans = [false, true];
    let and = |left, right| left && right;
    let values = [0_u8, 1];
    let add = |left, right| left + right;

    assert_eq!(identity_element(&booleans, and), Some(true));
    assert!(is_monoid(&booleans, and));
    assert!(!is_group(&booleans, and));
    assert!(!is_closed_under(&values, add));
    assert!(!is_ring(&values, add, add));
}