iter_builder/
traits.rs

1use crate::{Meta, No};
2
3pub trait IterBase<S> {
4    type T;
5}
6pub trait IterNext<S>: IterBase<S> {
7    fn iter_next(&mut self, state: &mut S) -> Option<Self::T>;
8}
9pub trait IterNth<S>: IterBase<S> {
10    fn iter_nth(
11        &mut self,
12        state: &mut S,
13        next: &mut impl IterNext<S, T = Self::T>,
14        n: usize,
15    ) -> Option<Self::T>;
16}
17pub trait IterSizeHint<S>: IterBase<S> {
18    fn iter_size_hint(&self, state: &S) -> (usize, Option<usize>);
19}
20pub trait IterNextBack<S>: IterBase<S> {
21    fn iter_next_back(&mut self, state: &mut S) -> Option<Self::T>;
22}
23pub trait IterNthBack<S>: IterBase<S> {
24    fn iter_nth_back(
25        &mut self,
26        state: &mut S,
27        next_back: &mut impl IterNextBack<S, T = Self::T>,
28        n: usize,
29    ) -> Option<Self::T>;
30}
31
32pub struct Predicate<const C: bool>;
33pub trait Implemented {}
34pub trait Unimplemented {}
35
36impl<F, S, T> Implemented for Meta<F, S, T> { }
37impl<T> Unimplemented for No<T> { }
38impl Implemented for Predicate<true> { }
39impl Unimplemented for Predicate<false> { }
40
41impl<T, S> IterBase<S> for No<T> {
42    type T = T;
43}
44impl<T, S> IterNext<S> for No<T> {
45    #[inline]
46    fn iter_next(&mut self, _state: &mut S) -> Option<Self::T> {
47        None
48    }
49}
50impl<T, S> IterNth<S> for No<T> {
51    #[inline]
52    fn iter_nth(
53        &mut self,
54        state: &mut S,
55        next: &mut impl IterNext<S, T = Self::T>,
56        n: usize,
57    ) -> Option<Self::T> {
58        for _ in 0..n {
59            next.iter_next(state)?;
60        }
61        next.iter_next(state)
62    }
63}
64impl<T, S> IterSizeHint<S> for No<T> {
65    #[inline]
66    fn iter_size_hint(&self, _state: &S) -> (usize, Option<usize>) {
67        (0, None)
68    }
69}
70impl<T, S> IterNthBack<S> for No<T> {
71    #[inline]
72    fn iter_nth_back(
73        &mut self,
74        state: &mut S,
75        next_back: &mut impl IterNextBack<S, T = Self::T>,
76        n: usize,
77    ) -> Option<Self::T> {
78        for _ in 0..n {
79            next_back.iter_next_back(state)?;
80        }
81        next_back.iter_next_back(state)
82    }
83}
84impl<F, S, T> IterBase<S> for Meta<F, S, T> {
85    type T = T;
86}
87impl<F: FnMut(&mut S) -> Option<T>, S, T> IterNext<S> for Meta<F, S, T> {
88    #[inline]
89    fn iter_next(&mut self, state: &mut S) -> Option<Self::T> {
90        (self.0)(state)
91    }
92}
93impl<F: FnMut(&mut S, usize) -> Option<T>, S, T> IterNth<S> for Meta<F, S, T> {
94    #[inline]
95    fn iter_nth(
96        &mut self,
97        state: &mut S,
98        _next: &mut impl IterNext<S, T = Self::T>,
99        n: usize,
100    ) -> Option<Self::T> {
101        (self.0)(state, n)
102    }
103}
104impl<F: Fn(&S) -> (usize, Option<usize>), S, T> IterSizeHint<S> for Meta<F, S, T> {
105    #[inline]
106    fn iter_size_hint(&self, state: &S) -> (usize, Option<usize>) {
107        (self.0)(state)
108    }
109}
110impl<F: FnMut(&mut S) -> Option<T>, S, T> IterNextBack<S> for Meta<F, S, T> {
111    #[inline]
112    fn iter_next_back(&mut self, state: &mut S) -> Option<Self::T> {
113        (self.0)(state)
114    }
115}
116impl<F: FnMut(&mut S, usize) -> Option<T>, S, T> IterNthBack<S> for Meta<F, S, T> {
117    #[inline]
118    fn iter_nth_back(
119        &mut self,
120        state: &mut S,
121        _next_back: &mut impl IterNextBack<S, T = Self::T>,
122        n: usize,
123    ) -> Option<Self::T> {
124        (self.0)(state, n)
125    }
126}