lender/fallible_adapters/
owned.rs1use alloc::borrow::ToOwned;
2
3use fallible_iterator::{DoubleEndedFallibleIterator, FallibleIterator};
4
5use crate::{DoubleEndedFallibleLender, FallibleLend, FallibleLender, Owned};
6
7impl<T, L> FallibleIterator for Owned<L>
8where
9 L: FallibleLender,
10 for<'all> FallibleLend<'all, L>: ToOwned<Owned = T>,
11{
12 type Item = T;
13 type Error = L::Error;
14
15 #[inline]
16 fn next(&mut self) -> Result<Option<Self::Item>, Self::Error> {
17 Ok(self.lender.next()?.map(|ref x| x.to_owned()))
18 }
19
20 #[inline(always)]
21 fn size_hint(&self) -> (usize, Option<usize>) {
22 self.lender.size_hint()
23 }
24
25 #[inline]
26 fn fold<B, F>(self, init: B, mut f: F) -> Result<B, Self::Error>
27 where
28 Self: Sized,
29 F: FnMut(B, Self::Item) -> Result<B, Self::Error>,
30 {
31 self.lender.fold(init, |acc, ref x| f(acc, x.to_owned()))
32 }
33
34 #[inline(always)]
35 fn count(self) -> Result<usize, Self::Error>
36 where
37 Self: Sized,
38 {
39 self.lender.count()
40 }
41
42 #[inline]
43 fn nth(&mut self, n: usize) -> Result<Option<Self::Item>, Self::Error> {
44 Ok(self.lender.nth(n)?.map(|ref x| x.to_owned()))
45 }
46}
47
48impl<T, L> DoubleEndedFallibleIterator for Owned<L>
49where
50 L: DoubleEndedFallibleLender,
51 for<'all> FallibleLend<'all, L>: ToOwned<Owned = T>,
52{
53 #[inline]
54 fn next_back(&mut self) -> Result<Option<Self::Item>, Self::Error> {
55 Ok(self.lender.next_back()?.map(|ref x| x.to_owned()))
56 }
57
58 #[inline]
59 fn rfold<B, F>(self, init: B, mut f: F) -> Result<B, Self::Error>
60 where
61 Self: Sized,
62 F: FnMut(B, Self::Item) -> Result<B, Self::Error>,
63 {
64 self.lender.rfold(init, |acc, ref x| f(acc, x.to_owned()))
65 }
66}