use crate::{Condition, Fact};
#[must_use]
pub const fn always() -> Condition {
Condition::Always
}
#[must_use]
pub const fn never() -> Condition {
Condition::Never
}
#[must_use]
pub fn has<F: Fact>() -> Condition {
Condition::Has(crate::FactId::from_trusted(F::ID.as_str()))
}
#[must_use]
pub const fn has_id(fact: crate::FactId) -> Condition {
Condition::Has(fact)
}
#[must_use]
pub fn not(condition: Condition) -> Condition {
Condition::Not(Box::new(condition))
}
#[must_use]
pub fn all(conditions: impl IntoIterator<Item = Condition>) -> Condition {
let conditions = conditions.into_iter().collect::<Vec<_>>();
if conditions.is_empty() {
Condition::Never
} else {
Condition::All(conditions)
}
}
#[must_use]
pub fn any(conditions: impl IntoIterator<Item = Condition>) -> Condition {
let conditions = conditions.into_iter().collect::<Vec<_>>();
if conditions.is_empty() {
Condition::Never
} else {
Condition::Any(conditions)
}
}