lender/adapters/
rev.rs

1use crate::{try_trait_v2::Try, DoubleEndedLender, ExactSizeLender, FusedLender, Lend, Lender, Lending};
2#[derive(Clone, Debug)]
3#[must_use = "lenders are lazy and do nothing unless consumed"]
4pub struct Rev<L> {
5    lender: L,
6}
7impl<L> Rev<L> {
8    pub(crate) fn new(lender: L) -> Rev<L> {
9        Rev { lender }
10    }
11    pub fn into_inner(self) -> L {
12        self.lender
13    }
14}
15impl<'lend, L> Lending<'lend> for Rev<L>
16where
17    L: Lender,
18{
19    type Lend = Lend<'lend, L>;
20}
21impl<L> Lender for Rev<L>
22where
23    L: DoubleEndedLender,
24{
25    #[inline]
26    fn next(&mut self) -> Option<Lend<'_, Self>> {
27        self.lender.next_back()
28    }
29    #[inline]
30    fn size_hint(&self) -> (usize, Option<usize>) {
31        self.lender.size_hint()
32    }
33    #[inline]
34    fn advance_by(&mut self, n: usize) -> Result<(), core::num::NonZeroUsize> {
35        self.lender.advance_back_by(n)
36    }
37    #[inline]
38    fn nth(&mut self, n: usize) -> Option<Lend<'_, Self>> {
39        self.lender.nth_back(n)
40    }
41    fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
42    where
43        Self: Sized,
44        F: FnMut(B, Lend<'_, Self>) -> R,
45        R: Try<Output = B>,
46    {
47        self.lender.try_rfold(init, f)
48    }
49    fn fold<B, F>(self, init: B, f: F) -> B
50    where
51        Self: Sized,
52        F: FnMut(B, Lend<'_, Self>) -> B,
53    {
54        self.lender.rfold(init, f)
55    }
56    #[inline]
57    fn find<P>(&mut self, predicate: P) -> Option<Lend<'_, Self>>
58    where
59        Self: Sized,
60        P: FnMut(&Lend<'_, Self>) -> bool,
61    {
62        self.lender.rfind(predicate)
63    }
64}
65impl<L> DoubleEndedLender for Rev<L>
66where
67    L: DoubleEndedLender,
68{
69    #[inline]
70    fn next_back(&mut self) -> Option<Lend<'_, Self>> {
71        self.lender.next()
72    }
73    #[inline]
74    fn advance_back_by(&mut self, n: usize) -> Result<(), core::num::NonZeroUsize> {
75        self.lender.advance_by(n)
76    }
77    #[inline]
78    fn nth_back(&mut self, n: usize) -> Option<Lend<'_, Self>> {
79        self.lender.nth(n)
80    }
81    fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
82    where
83        Self: Sized,
84        F: FnMut(B, Lend<'_, Self>) -> R,
85        R: Try<Output = B>,
86    {
87        self.lender.try_fold(init, f)
88    }
89    fn rfold<B, F>(self, init: B, f: F) -> B
90    where
91        Self: Sized,
92        F: FnMut(B, Lend<'_, Self>) -> B,
93    {
94        self.lender.fold(init, f)
95    }
96    fn rfind<P>(&mut self, predicate: P) -> Option<Lend<'_, Self>>
97    where
98        Self: Sized,
99        P: FnMut(&Lend<'_, Self>) -> bool,
100    {
101        self.lender.find(predicate)
102    }
103}
104impl<L> ExactSizeLender for Rev<L>
105where
106    L: DoubleEndedLender + ExactSizeLender,
107{
108    #[inline]
109    fn len(&self) -> usize {
110        self.lender.len()
111    }
112}
113impl<L> FusedLender for Rev<L> where L: DoubleEndedLender + FusedLender {}
114impl<L> Default for Rev<L>
115where
116    L: Default,
117{
118    fn default() -> Self {
119        Rev::new(L::default())
120    }
121}