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(())
}