use crate::ir::PredicateSymbol;
use std::collections::BTreeSet;
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Stratification {
pub strata: Vec<Stratum>,
pub rule_stratum: Vec<usize>,
}
impl Stratification {
#[must_use]
pub fn stratum_of_rule(&self, rule_index: usize) -> Option<usize> {
self.rule_stratum.get(rule_index).copied()
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Stratum {
pub rules: BTreeSet<usize>,
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub enum StratificationError {
UnstratifiableCycle {
predicates: Vec<PredicateSymbol>,
},
}