1pub(crate) struct ReversibleIterable<It> {
2 pub(crate) it: It,
3 pub(crate) reverse: bool,
4}
5
6impl<T> ReversibleIterable<T> {
7 pub(crate) const fn new(it: T, reverse: bool) -> Self {
8 Self { it, reverse }
9 }
10}
11
12impl<It, Item> ReversibleIterable<It>
13where
14 It: Iterator<Item = Item>,
15{
16 pub(crate) fn find_single_ended<F>(mut self, pred: F) -> Option<Item>
17 where
18 F: FnMut(&Item) -> bool,
19 {
20 if self.reverse {
21 self.it.filter(pred).last()
22 } else {
23 self.it.find(pred)
24 }
25 }
26}
27
28impl<It, Item> ReversibleIterable<It>
29where
30 It: DoubleEndedIterator<Item = Item>,
31{
32 pub(crate) fn find<F>(mut self, mut pred: F) -> Option<Item>
33 where
34 F: FnMut(&Item) -> bool,
35 {
36 if self.reverse {
37 self.it.rfind(|x| pred(x))
38 } else {
39 self.it.find(|x| pred(x))
40 }
41 }
42}