use crate::plan::{ExecutionPlan, optimize::OptimizeContext};
pub trait Rule: Send + Sync + 'static {
fn name(&self) -> &'static str;
fn rewrite(&self, plan: ExecutionPlan, ctx: &OptimizeContext<'_>)
-> Transformed<ExecutionPlan>;
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Transformed<T> {
pub plan: T,
pub changed: bool,
}
impl<T> Transformed<T> {
#[must_use]
pub const fn unchanged(plan: T) -> Self {
Self {
plan,
changed: false,
}
}
#[must_use]
pub const fn changed(plan: T) -> Self {
Self {
plan,
changed: true,
}
}
#[must_use]
pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Transformed<U> {
Transformed {
plan: f(self.plan),
changed: self.changed,
}
}
}