use super::coordset::CoordSet;
use super::info::PredicateInfo;
use super::recognizers;
pub fn analyze(predicate: &str, coords: &CoordSet) -> PredicateInfo {
recognizers::recognize(predicate, coords)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::iteration::comprehension::predicate::info::{
Determinism, Factorization, OpaqueReason,
};
#[test]
fn empty_predicate_is_unknown() {
let info = analyze("", &CoordSet::all_discrete::<[&str; 0], &str>([]));
assert!(matches!(
info.factorization,
Factorization::Opaque(OpaqueReason::UnknownPattern)
));
}
#[test]
fn deterministic_run_twice() {
let coords = CoordSet::all_discrete(["k", "limit"]);
let a = analyze("{k} > 0 && {limit} <= 100", &coords);
let b = analyze("{k} > 0 && {limit} <= 100", &coords);
assert_eq!(a, b);
}
#[test]
fn integration_per_axis_via_analyze_entry() {
let coords = CoordSet::all_discrete(["k"]);
let info = analyze("{k} >= 5", &coords);
assert!(matches!(info.factorization, Factorization::PerAxis(_)));
assert_eq!(info.determinism, Determinism::Deterministic);
}
}