Skip to main content

workflow/
workflow.rs

1//! Workflow reachability with reflexive-transitive closure.
2
3use relmath::{BinaryRelation, UnaryRelation};
4
5fn main() {
6    let step = BinaryRelation::from_pairs([
7        ("Draft", "Review"),
8        ("Review", "Approved"),
9        ("Review", "Rejected"),
10    ]);
11
12    let states =
13        UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14    let reachable = step.reflexive_transitive_closure(&states);
15    let draft = UnaryRelation::singleton("Draft");
16
17    assert!(reachable.contains(&"Archived", &"Archived"));
18    assert!(reachable.contains(&"Draft", &"Approved"));
19
20    println!(
21        "reachable from Draft: {:?}",
22        reachable.image(&draft).to_vec()
23    );
24}