Skip to main content

lender/fallible_adapters/
owned.rs

1use 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}