use crate::{Sans, step::Step};
pub struct FromFn<F>(F);
impl<I, O, D, F> Sans<I, O> for FromFn<F>
where
F: FnMut(I) -> Step<O, D>,
{
type Return = D;
fn next(&mut self, input: I) -> Step<O, Self::Return> {
(self.0)(input)
}
}
pub fn from_fn<F>(f: F) -> FromFn<F> {
FromFn(f)
}
pub struct Repeat<F>(F);
impl<I, O, F> Sans<I, O> for Repeat<F>
where
F: FnMut(I) -> O,
{
type Return = I;
fn next(&mut self, input: I) -> Step<O, Self::Return> {
Step::Yielded(self.0(input))
}
}
pub fn repeat<I, O, F: FnMut(I) -> O>(f: F) -> Repeat<F> {
Repeat(f)
}
pub struct Once<F>(Option<F>);
pub fn once<F>(f: F) -> Once<F> {
Once(Some(f))
}
impl<I, O, F> Sans<I, O> for Once<F>
where
F: FnOnce(I) -> O,
{
type Return = I;
fn next(&mut self, input: I) -> Step<O, Self::Return> {
match self.0.take() {
Some(f) => Step::Yielded(f(input)),
None => Step::Complete(input),
}
}
}