nmr_schedule/modifiers/
mod.rs1mod basic;
4mod iterate;
5mod psf_polisher;
6mod tm_filter;
7
8pub use basic::*;
9pub use iterate::*;
10use ndarray::Dimension;
11pub use psf_polisher::*;
12pub use tm_filter::*;
13
14use alloc::borrow::ToOwned;
15
16use crate::{
17 generators::{Generator, Trace},
18 Schedule,
19};
20
21pub mod generators {
23 pub use super::basic::generators::*;
24 pub use super::iterate::generators::*;
25 pub use super::psf_polisher::generators::*;
26 pub use super::tm_filter::generators::*;
27}
28
29pub trait Modifier<Dim: Dimension> {
33 type Output<T: Generator<Dim>>: Generator<Dim>;
35
36 fn modify<T: Generator<Dim>>(self, generator: T) -> Self::Output<T>;
38}
39
40pub trait Filter<Dim: Dimension> {
44 fn filter(&self, sched: Schedule<Dim>) -> Schedule<Dim> {
46 self.filter_with_iter_and_trace(sched, 0).into_sched()
47 }
48
49 fn filter_with_iter_and_trace(&self, sched: Schedule<Dim>, iteration: u64) -> Trace<Dim>;
51
52 fn filter_from_iter_and_trace(&self, mut trace: Trace<Dim>, iteration: u64) -> Trace<Dim> {
54 let mut trace_after = self.filter_with_iter_and_trace(trace.sched().to_owned(), iteration);
55
56 trace.stack.append(&mut trace_after.stack);
57
58 trace
59 }
60}
61
62#[macro_export]
103macro_rules! modifier {
104 ($(<$($name:ident : $bounds:path),+>)? $modifier:ident <$dim:ident>, $trait_name:ident, $doc:expr, $builder_name: ident, $($arg:ident : $ty:ty),*) => {
105 #[doc=$doc]
106 #[doc=concat!("\n\nCan be used as the `.", stringify!($builder_name), "()` method.")]
107 #[derive(Debug)]
108 #[allow(missing_copy_implementations)]
109 pub struct $modifier $(<$($name: $bounds),+>)? ($($ty),*);
110
111 impl $(<$($name: $bounds),+>)? $modifier $(<$($name),+>)? {
112 #[doc=concat!("Create a new instance of the modifier.")]
113 #[allow(clippy::new_without_default)]
114 pub const fn new($($arg : $ty),*) -> $modifier $(<$($name),+>)? {
115 $modifier($($arg),*)
116 }
117 }
118
119 #[doc=concat!("Builder trait for the [`", stringify!($modifier), "`] modifier.")]
120 pub trait $trait_name: Generator<$dim> {
121 #[doc=$doc]
122 fn $builder_name<$($($name: $bounds),+)?>(self, $($arg : $ty),*) -> <$modifier $(<$($name),+>)? as Modifier<$dim>>::Output<Self> where Self: Sized + {
123 self.then($modifier::new($($arg),*))
124 }
125 }
126
127 impl<T: Generator<$dim>> $trait_name for T {}
128 };
129 ($dim:ident $(<$($name:ident : $bounds:path),+>)? $modifier:ident, $trait_name:ident, $doc:expr, $builder_name:ident, $($arg:ident : $ty:ty),*) => {
130 #[doc=$doc]
131 #[doc=concat!("\n\nCan be used as the `.", stringify!($builder_name), "()` method.")]
132 #[derive(Debug)]
133 #[allow(missing_copy_implementations)]
134 pub struct $modifier <$dim: Dimension, $($($name: $bounds),+)?> ($($ty),*, PhantomData<$dim>);
135
136 impl <$dim: Dimension, $($($name: $bounds),+)?> $modifier <$dim $(, $($name),+)?> {
137 #[doc=concat!("Create a new instance of the modifier.")]
138 #[allow(clippy::new_without_default)]
139 pub const fn new($($arg : $ty),*) -> $modifier <$dim $(, $($name),+)?> {
140 $modifier($($arg),*, PhantomData)
141 }
142 }
143
144 #[doc=concat!("Builder trait for the [`", stringify!($modifier), "`] modifier.")]
145 pub trait $trait_name<$dim: Dimension>: Generator<$dim> {
146 #[doc=$doc]
147 fn $builder_name<$($($name: $bounds),+)?>(self, $($arg : $ty),*) -> <$modifier <$dim $(, $($name),+)?> as Modifier<$dim>>::Output<Self> where Self: Sized + {
148 self.then($modifier::new($($arg),*))
149 }
150 }
151
152 impl<Dim: Dimension, T: Generator<Dim>> $trait_name<Dim> for T {}
153 };
154}