use relmath::{BinaryRelation, FiniteCarrier};
fn main() {
let step = BinaryRelation::from_pairs([("Draft", "Review")]);
let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);
let inferred = step.carrier();
let inferred_identity = BinaryRelation::identity(&inferred);
let explicit_identity = BinaryRelation::identity_on(&states);
let reachable = step.reflexive_transitive_closure_on(&states);
assert_eq!(inferred.to_vec(), vec!["Draft", "Review"]);
assert_eq!(
inferred_identity.to_vec(),
vec![("Draft", "Draft"), ("Review", "Review")]
);
assert_eq!(
explicit_identity.to_vec(),
vec![
("Archived", "Archived"),
("Draft", "Draft"),
("Review", "Review"),
]
);
assert_eq!(states.to_vec(), vec!["Archived", "Draft", "Review"]);
assert_eq!(
reachable.to_vec(),
step.reflexive_transitive_closure(&states.to_unary_relation())
.to_vec()
);
assert!(reachable.is_reflexive_on(&states));
assert!(step.is_irreflexive_on(&states));
assert!(reachable.contains(&"Archived", &"Archived"));
assert!(reachable.contains(&"Draft", &"Review"));
println!(
"explicit carrier: {:?}; inferred support: {:?}; inferred identity: {:?}; explicit identity: {:?}; reachable: {:?}",
states.to_vec(),
inferred.to_vec(),
inferred_identity.to_vec(),
explicit_identity.to_vec(),
reachable.to_vec()
);
}