mod basic;
mod iterate;
mod psf_polisher;
mod tm_filter;
pub use basic::*;
pub use iterate::*;
use ndarray::Dimension;
pub use psf_polisher::*;
pub use tm_filter::*;
use alloc::borrow::ToOwned;
use crate::{
generators::{Generator, Trace},
Schedule,
};
pub mod generators {
pub use super::basic::generators::*;
pub use super::iterate::generators::*;
pub use super::psf_polisher::generators::*;
pub use super::tm_filter::generators::*;
}
pub trait Modifier<Dim: Dimension> {
type Output<T: Generator<Dim>>: Generator<Dim>;
fn modify<T: Generator<Dim>>(self, generator: T) -> Self::Output<T>;
}
pub trait Filter<Dim: Dimension> {
fn filter(&self, sched: Schedule<Dim>) -> Schedule<Dim> {
self.filter_with_iter_and_trace(sched, 0).into_sched()
}
fn filter_with_iter_and_trace(&self, sched: Schedule<Dim>, iteration: u64) -> Trace<Dim>;
fn filter_from_iter_and_trace(&self, mut trace: Trace<Dim>, iteration: u64) -> Trace<Dim> {
let mut trace_after = self.filter_with_iter_and_trace(trace.sched().to_owned(), iteration);
trace.stack.append(&mut trace_after.stack);
trace
}
}
#[macro_export]
macro_rules! modifier {
($(<$($name:ident : $bounds:path),+>)? $modifier:ident <$dim:ident>, $trait_name:ident, $doc:expr, $builder_name: ident, $($arg:ident : $ty:ty),*) => {
#[doc=$doc]
#[doc=concat!("\n\nCan be used as the `.", stringify!($builder_name), "()` method.")]
#[derive(Debug)]
#[allow(missing_copy_implementations)]
pub struct $modifier $(<$($name: $bounds),+>)? ($($ty),*);
impl $(<$($name: $bounds),+>)? $modifier $(<$($name),+>)? {
#[doc=concat!("Create a new instance of the modifier.")]
#[allow(clippy::new_without_default)]
pub const fn new($($arg : $ty),*) -> $modifier $(<$($name),+>)? {
$modifier($($arg),*)
}
}
#[doc=concat!("Builder trait for the [`", stringify!($modifier), "`] modifier.")]
pub trait $trait_name: Generator<$dim> {
#[doc=$doc]
fn $builder_name<$($($name: $bounds),+)?>(self, $($arg : $ty),*) -> <$modifier $(<$($name),+>)? as Modifier<$dim>>::Output<Self> where Self: Sized + {
self.then($modifier::new($($arg),*))
}
}
impl<T: Generator<$dim>> $trait_name for T {}
};
($dim:ident $(<$($name:ident : $bounds:path),+>)? $modifier:ident, $trait_name:ident, $doc:expr, $builder_name:ident, $($arg:ident : $ty:ty),*) => {
#[doc=$doc]
#[doc=concat!("\n\nCan be used as the `.", stringify!($builder_name), "()` method.")]
#[derive(Debug)]
#[allow(missing_copy_implementations)]
pub struct $modifier <$dim: Dimension, $($($name: $bounds),+)?> ($($ty),*, PhantomData<$dim>);
impl <$dim: Dimension, $($($name: $bounds),+)?> $modifier <$dim $(, $($name),+)?> {
#[doc=concat!("Create a new instance of the modifier.")]
#[allow(clippy::new_without_default)]
pub const fn new($($arg : $ty),*) -> $modifier <$dim $(, $($name),+)?> {
$modifier($($arg),*, PhantomData)
}
}
#[doc=concat!("Builder trait for the [`", stringify!($modifier), "`] modifier.")]
pub trait $trait_name<$dim: Dimension>: Generator<$dim> {
#[doc=$doc]
fn $builder_name<$($($name: $bounds),+)?>(self, $($arg : $ty),*) -> <$modifier <$dim $(, $($name),+)?> as Modifier<$dim>>::Output<Self> where Self: Sized + {
self.then($modifier::new($($arg),*))
}
}
impl<Dim: Dimension, T: Generator<Dim>> $trait_name<Dim> for T {}
};
}