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}