utils.rs

 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}