Skip to main content

verbs/
collapse_plan.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Pure collapse/expand planning (single decision type).
3
4/// Collapse requires non-empty source states.
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum CollapsePlan {
7    Proceed,
8    StatesRequired,
9}
10
11impl CollapsePlan {
12    pub fn plan(state_count: usize) -> Self {
13        if state_count > 0 {
14            Self::Proceed
15        } else {
16            Self::StatesRequired
17        }
18    }
19
20    /// Advice kind when collapse is invoked without sources.
21    pub fn states_required_kind() -> &'static str {
22        "collapse_states_required"
23    }
24}
25
26/// Whether collapse has at least one source state.
27pub fn collapse_has_source_states(state_count: usize) -> bool {
28    matches!(CollapsePlan::plan(state_count), CollapsePlan::Proceed)
29}
30
31/// Advice kind when collapse is invoked without sources.
32pub fn collapse_states_required_kind() -> &'static str {
33    CollapsePlan::states_required_kind()
34}
35
36pub fn plan_collapse(state_count: usize) -> CollapsePlan {
37    CollapsePlan::plan(state_count)
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn collapse_plan_requires_states() {
46        assert_eq!(plan_collapse(0), CollapsePlan::StatesRequired);
47        assert_eq!(plan_collapse(2), CollapsePlan::Proceed);
48        assert!(!collapse_has_source_states(0));
49        assert!(collapse_has_source_states(1));
50        assert_eq!(collapse_states_required_kind(), "collapse_states_required");
51    }
52}