relmath-rs 0.7.0

Relation-first mathematics and scientific computing in Rust.
Documentation
//! Shared read-only relation views across exact relation types.

use relmath::prelude::{BinaryRelation, NaryRelation, RelationView, UnaryRelation};

fn tuple_count<R: RelationView>(relation: &R) -> usize {
    relation.len()
}

fn main() -> Result<(), relmath::NaryRelationError> {
    let people = UnaryRelation::from_values(["Ada", "Bob"]);
    let parent = BinaryRelation::from_pairs([("Ada", "Bob"), ("Bob", "Cara")]);
    let enrollments =
        NaryRelation::from_rows(["student", "course"], [["Ada", "Math"], ["Bob", "Physics"]])?;

    assert_eq!(tuple_count(&people), 2);
    assert_eq!(tuple_count(&parent), 2);
    assert_eq!(tuple_count(&enrollments), 2);

    assert_eq!(
        people.tuples().copied().collect::<Vec<_>>(),
        vec!["Ada", "Bob"]
    );
    assert_eq!(
        parent.tuples().copied().collect::<Vec<_>>(),
        vec![("Ada", "Bob"), ("Bob", "Cara")]
    );
    assert_eq!(
        enrollments
            .tuples()
            .map(|row| row.to_vec())
            .collect::<Vec<_>>(),
        vec![vec!["Ada", "Math"], vec!["Bob", "Physics"]]
    );

    println!("people: {:?}", people.tuples().copied().collect::<Vec<_>>());
    println!("parent: {:?}", parent.tuples().copied().collect::<Vec<_>>());
    println!(
        "enrollments: {:?}",
        enrollments
            .tuples()
            .map(|row| row.to_vec())
            .collect::<Vec<_>>()
    );

    Ok(())
}