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}