Skip to main content

relation_view/
relation_view.rs

1//! Shared read-only relation views across exact relation types.
2
3use relmath::prelude::{BinaryRelation, NaryRelation, RelationView, UnaryRelation};
4
5fn tuple_count<R: RelationView>(relation: &R) -> usize {
6    relation.len()
7}
8
9fn main() -> Result<(), relmath::NaryRelationError> {
10    let people = UnaryRelation::from_values(["Ada", "Bob"]);
11    let parent = BinaryRelation::from_pairs([("Ada", "Bob"), ("Bob", "Cara")]);
12    let enrollments =
13        NaryRelation::from_rows(["student", "course"], [["Ada", "Math"], ["Bob", "Physics"]])?;
14
15    assert_eq!(tuple_count(&people), 2);
16    assert_eq!(tuple_count(&parent), 2);
17    assert_eq!(tuple_count(&enrollments), 2);
18
19    assert_eq!(
20        people.tuples().copied().collect::<Vec<_>>(),
21        vec!["Ada", "Bob"]
22    );
23    assert_eq!(
24        parent.tuples().copied().collect::<Vec<_>>(),
25        vec![("Ada", "Bob"), ("Bob", "Cara")]
26    );
27    assert_eq!(
28        enrollments
29            .tuples()
30            .map(|row| row.to_vec())
31            .collect::<Vec<_>>(),
32        vec![vec!["Ada", "Math"], vec!["Bob", "Physics"]]
33    );
34
35    println!("people: {:?}", people.tuples().copied().collect::<Vec<_>>());
36    println!("parent: {:?}", parent.tuples().copied().collect::<Vec<_>>());
37    println!(
38        "enrollments: {:?}",
39        enrollments
40            .tuples()
41            .map(|row| row.to_vec())
42            .collect::<Vec<_>>()
43    );
44
45    Ok(())
46}