Skip to main content

lender/traits/
fallible_lender.rs

1use alloc::borrow::ToOwned;
2use core::{cmp::Ordering, num::NonZeroUsize, ops::ControlFlow};
3
4use stable_try_trait_v2::{
5    ChangeOutputType, FromResidual, Residual, Try, internal::NeverShortCircuit,
6};
7
8use crate::{
9    Chain, Chunk, Chunky, Cloned, Copied, Covar, Cycle, DoubleEndedFallibleLender, Enumerate,
10    ExactSizeFallibleLender, ExtendLender, FallibleFlatMap, FallibleFlatten, FallibleIntersperse,
11    FallibleIntersperseWith, FalliblePeekable, FallibleTryShuntAdapter, Filter, FilterMap,
12    FirstShunt, FromFallibleIterRef, FromLender, Fuse, ImplBound, Inspect, Iter, Map, MapErr,
13    MapIntoIter, MapWhile, Mutate, NonFallibleAdapter, Owned, ProductFallibleLender, Ref, Rev,
14    Scan, SecondShunt, Skip, SkipWhile, StepBy, SumFallibleLender, Take, TakeWhile, TupleLend, Zip,
15    fallible_unzip,
16    higher_order::{FnMutHKARes, FnMutHKAResOpt},
17    non_fallible_adapter,
18    traits::collect::IntoFallibleLender,
19};
20
21/// The fallible counterpart of [`Lending`](crate::Lending). See its documentation
22/// for details on the HRTB implicit-bound technique used here.
23///
24/// Must be defined for any type that implements [`FallibleLender`].
25pub trait FallibleLending<'lend, __ImplBound: ImplBound = Ref<'lend, Self>> {
26    /// The type being lent.
27    type Lend: 'lend;
28}
29
30/// A readable shorthand for the type of the items of a [`FallibleLender`] `L`.
31pub type FallibleLend<'lend, L> = <L as FallibleLending<'lend>>::Lend;
32
33/// A trait for dealing with fallible lending iterators.
34///
35/// This is the main fallible lender trait. For more about the concept of lenders
36/// generally, please see the [crate documentation](crate).
37///
38/// For more about the concept of iterators
39/// generally, please see [`core::iter`].
40///
41/// # Covariance Checking
42///
43/// This crate provide a mechanism to guarantee that the
44/// [`Lend`](FallibleLending::Lend) type of a fallible lender is covariant in
45/// its lifetime. This is crucial to avoid undefined behavior, as many of the
46/// operations on lenders rely on covariance to ensure that lends do not outlive
47/// their lenders.
48///
49/// The mechanism is based on the
50/// [`__check_covariance`](FallibleLender::__check_covariance) method of this
51/// trait, which is an internal method for compile-time covariance checking.
52/// Adapters relying on covariance of other fallible lenders should call this
53/// method for the lenders they are adapting.
54///
55/// The mechanism can be circumvented with unsafe code, and in this case the
56/// burden of checking covariance is on the implementor. However, there's no way
57/// to prevent that [`__check_covariance`](FallibleLender::__check_covariance)
58/// is implemented vacuously using a non-returning statement (`todo!()`,
59/// `unimplemented!()`, `panic!()`, `loop {}`, etc.), unless you call the method
60/// explicitly somewhere in your code. Adapters will call recursively adapted
61/// lenders, but there is no way to force the call on the user-facing type.
62pub trait FallibleLender: for<'all /* where Self: 'all */> FallibleLending<'all> {
63    /// The error type.
64    type Error;
65
66    /// Internal method for compile-time covariance checking.
67    ///
68    /// This method should rarely be implemented directly. Instead, use the
69    /// provided macros:
70    ///
71    /// - When implementing source lenders (lenders with concrete
72    ///   [`Lend`](FallibleLending::Lend) types), users should invoke
73    ///   [`check_covariance_fallible!`](crate::check_covariance_fallible) in
74    ///   their [`FallibleLender`] impl. The macro implements the method as
75    ///   `{ proof }`, which only compiles if the
76    ///   [`Lend`](FallibleLending::Lend) type is covariant in its lifetime.
77    ///
78    /// - In all other cases (e.g., when implementing adapters), use
79    ///   [`unsafe_assume_covariance_fallible!`][uacf]
80    ///   in the [`FallibleLender`] impl. The macro
81    ///   implements the method as `{
82    ///   unsafe { core::mem::transmute(proof) } }`, which is a no-op.
83    ///   This is unsafe because it is up to the implementor to
84    ///   guarantee that the [`Lend`](FallibleLending::Lend) type is
85    ///   covariant in its lifetime.
86    ///
87    /// When relying on covariance of other types, this method should
88    /// be called in every constructor, or in every method requiring
89    /// covariance, of such types. In particular, adapters should call
90    /// this method for the lender they are adapting. The call makes it
91    /// impossible to implement the check with non-returning code
92    /// (`todo!()`, `unimplemented!()`, `panic!()`, `loop {}`, etc.).
93    ///
94    /// See [`crate::Lender::__check_covariance`] for more details
95    /// on how this method works.
96    ///
97    /// [uacf]: crate::unsafe_assume_covariance_fallible
98    fn __check_covariance<'long: 'short, 'short>(
99        proof: crate::CovariantProof<&'short <Self as FallibleLending<'long>>::Lend>,
100    ) -> crate::CovariantProof<&'short <Self as FallibleLending<'short>>::Lend>;
101
102    /// Yields the next lend, if any, of the lender, or `Ok(None)` when iteration
103    /// is finished.
104    ///
105    /// The behavior of calling this method after a previous call has returned
106    /// `Ok(None)` or `Err` is implementation defined. See
107    /// [`FusedFallibleLender`](crate::FusedFallibleLender) for lenders that
108    /// guarantee `Ok(None)` is repeated after `Ok(None)`.
109    ///
110    /// Every lend is only guaranteed to be valid one at a time for any kind of
111    /// lender.
112    ///
113    /// # Examples
114    ///
115    /// ```rust
116    /// # use fallible_iterator::IteratorExt as _;
117    /// # use lender::prelude::*;
118    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
119    ///     [1, 2, 3].iter().into_fallible(),
120    /// );
121    /// assert_eq!(lender.next(), Ok(Some(&1)));
122    /// assert_eq!(lender.next(), Ok(Some(&2)));
123    /// assert_eq!(lender.next(), Ok(Some(&3)));
124    /// assert_eq!(lender.next(), Ok(None));
125    /// ```
126    fn next(&mut self) -> Result<Option<FallibleLend<'_, Self>>, Self::Error>;
127
128    /// Takes the next `chunk_size` lends of the lender with temporary lender
129    /// [`Chunk`]. This is equivalent to cloning the lender and calling
130    /// [`take(chunk_size)`](FallibleLender::take) on it.
131    ///
132    /// # Examples
133    ///
134    /// ```rust
135    /// # use fallible_iterator::IteratorExt as _;
136    /// # use lender::prelude::*;
137    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
138    ///     [1, 2, 3].iter().into_fallible(),
139    /// );
140    /// let mut chunk_lender = lender.next_chunk(2);
141    /// assert_eq!(chunk_lender.next(), Ok(Some(&1)));
142    /// assert_eq!(chunk_lender.next(), Ok(Some(&2)));
143    /// assert_eq!(chunk_lender.next(), Ok(None));
144    /// ```
145    #[inline(always)]
146    fn next_chunk(&mut self, chunk_size: usize) -> Chunk<'_, Self>
147    where
148        Self: Sized,
149    {
150        Chunk::new_fallible(self, chunk_size)
151    }
152
153    /// Gets the estimated minimum and maximum length of the lender. Both
154    /// bounds assume that all remaining calls to
155    /// [`next()`](FallibleLender::next) succeed. That is,
156    /// [`next()`](FallibleLender::next) could return an [`Err`] in fewer
157    /// calls than specified by the lower bound.
158    ///
159    /// # Examples
160    ///
161    /// ```rust
162    /// # use fallible_iterator::IteratorExt as _;
163    /// # use lender::prelude::*;
164    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
165    ///     [1, 2, 3].iter().into_fallible(),
166    /// );
167    /// assert_eq!(lender.size_hint(), (3, Some(3)));
168    /// ```
169    #[inline(always)]
170    fn size_hint(&self) -> (usize, Option<usize>) { (0, None) }
171
172    /// Counts the number of lends in the lender by consuming it until the
173    /// lender yields `Ok(None)` or `Err(_)`.
174    ///
175    /// # Examples
176    ///
177    /// ```rust
178    /// # use fallible_iterator::IteratorExt as _;
179    /// # use lender::prelude::*;
180    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
181    ///     [1, 2, 3].iter().into_fallible(),
182    /// );
183    /// assert_eq!(lender.count(), Ok(3));
184    /// ```
185    #[inline(always)]
186    fn count(self) -> Result<usize, Self::Error>
187    where Self: Sized
188    {
189        self.fold(0, |n, _| Ok(n + 1))
190    }
191
192    /// Gets the last lend of the lender, if any, by consuming it.
193    ///
194    /// Unlike [`Iterator::last`], this method takes `&mut self`
195    /// rather than `self` because returning a lend that borrows
196    /// from the lender requires the lender to remain alive.
197    ///
198    /// # Examples
199    ///
200    /// ```rust
201    /// # use fallible_iterator::IteratorExt as _;
202    /// # use lender::prelude::*;
203    /// let mut lender =
204    ///     lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
205    ///         [1, 2, 3].iter().into_fallible(),
206    ///     );
207    /// assert_eq!(lender.last(), Ok(Some(&3)));
208    /// ```
209    #[inline]
210    fn last<'call>(&'call mut self) -> Result<Option<FallibleLend<'call, Self>>, Self::Error>
211    where
212        Self: Sized,
213    {
214        let mut last = None;
215        while let Some(x) = self.next()? {
216            // SAFETY: polonius return
217            last = Some(unsafe {
218                core::mem::transmute::<
219                    FallibleLend<'_, Self>,
220                    FallibleLend<'call, Self>
221                >(x)
222            });
223        }
224        Ok(last)
225    }
226
227    /// Advances the lender by `n` lends.
228    ///
229    /// Returns `Ok(Ok(()))` if the lender was successfully advanced by `n` elements.
230    /// Returns `Ok(Err(k))` if the lender did not have enough elements, where `k` is
231    /// the number of elements that could not be skipped.
232    /// Returns `Err(e)` if an error occurred while advancing.
233    ///
234    /// # Examples
235    ///
236    /// ```rust
237    /// # use fallible_iterator::IteratorExt as _;
238    /// # use lender::prelude::*;
239    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
240    ///     [1, 2, 3].iter().into_fallible(),
241    /// );
242    /// assert_eq!(lender.advance_by(2), Ok(Ok(())));
243    /// assert_eq!(lender.next(), Ok(Some(&3)));
244    /// ```
245    ///
246    /// ```rust
247    /// # use fallible_iterator::IteratorExt as _;
248    /// # use lender::prelude::*;
249    /// # use core::num::NonZeroUsize;
250    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
251    ///     [1, 2].iter().into_fallible(),
252    /// );
253    /// // Trying to advance by 5 when only 2 elements remain
254    /// assert_eq!(lender.advance_by(5), Ok(Err(NonZeroUsize::new(3).unwrap())));
255    /// ```
256    #[inline]
257    fn advance_by(&mut self, n: usize) -> Result<Result<(), NonZeroUsize>, Self::Error> {
258        for i in 0..n {
259            if self.next()?.is_none() {
260                // SAFETY: `i` is always less than `n`.
261                return Ok(Err(unsafe { NonZeroUsize::new_unchecked(n - i) }));
262            }
263        }
264        Ok(Ok(()))
265    }
266
267    /// Yields the nth lend of the lender, if any, by
268    /// consuming it. If the lender does not have enough
269    /// lends, returns `Ok(None)`.
270    ///
271    /// `n` is zero-indexed.
272    ///
273    /// # Examples
274    ///
275    /// ```rust
276    /// # use lender::prelude::*;
277    /// let data = [1, 2, 3, 4, 5];
278    /// let mut lender =
279    ///     data.iter().into_lender().into_fallible();
280    /// assert_eq!(lender.nth(2), Ok(Some(&3)));
281    /// assert_eq!(lender.nth(0), Ok(Some(&4)));
282    /// assert_eq!(lender.nth(5), Ok(None));
283    /// ```
284    #[inline]
285    fn nth(&mut self, n: usize) -> Result<Option<FallibleLend<'_, Self>>, Self::Error> {
286        if self.advance_by(n)?.is_err() {
287            return Ok(None);
288        }
289        self.next()
290    }
291
292    /// Skips `step - 1` lends between each lend of the lender.
293    ///
294    /// # Panics
295    ///
296    /// Panics if `step` is zero.
297    ///
298    /// # Examples
299    ///
300    /// ```rust
301    /// # use fallible_iterator::IteratorExt as _;
302    /// # use lender::prelude::*;
303    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
304    ///     [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].iter().into_fallible(),
305    /// );
306    /// let mut step_lender = lender.step_by(2);
307    /// assert_eq!(step_lender.next(), Ok(Some(&1)));
308    /// assert_eq!(step_lender.next(), Ok(Some(&3)));
309    /// assert_eq!(step_lender.next(), Ok(Some(&5)));
310    /// assert_eq!(step_lender.next(), Ok(Some(&7)));
311    /// assert_eq!(step_lender.next(), Ok(Some(&9)));
312    /// assert_eq!(step_lender.next(), Ok(None));
313    /// ```
314    #[inline(always)]
315    fn step_by(self, step: usize) -> StepBy<Self>
316    where
317        Self: Sized,
318    {
319        StepBy::new_fallible(self, step)
320    }
321
322    /// Chains the lender with another lender of the same type.
323    ///
324    /// The resulting lender will first yield all lends from `self`, then
325    /// all lends from `other`.
326    ///
327    /// # Examples
328    ///
329    /// ```rust
330    /// # use fallible_iterator::IteratorExt as _;
331    /// # use lender::prelude::*;
332    /// let a = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
333    ///     [1, 2].iter().into_fallible(),
334    /// );
335    /// let b = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
336    ///     [3, 4].iter().into_fallible(),
337    /// );
338    /// let mut chained = a.chain(b);
339    /// assert_eq!(chained.next(), Ok(Some(&1)));
340    /// assert_eq!(chained.next(), Ok(Some(&2)));
341    /// assert_eq!(chained.next(), Ok(Some(&3)));
342    /// assert_eq!(chained.next(), Ok(Some(&4)));
343    /// assert_eq!(chained.next(), Ok(None));
344    /// ```
345    #[inline(always)]
346    fn chain<U>(self, other: U) -> Chain<Self, <U as IntoFallibleLender>::FallibleLender>
347        where
348            Self: Sized,
349            U: IntoFallibleLender<Error = Self::Error> + for<'all> FallibleLending<'all, Lend = FallibleLend<'all, Self>>,
350    {
351        let other = other.into_fallible_lender();
352        Chain::new_fallible(self, other)
353    }
354
355    /// Zips the lender with another lender of the same or different type.
356    ///
357    /// # Examples
358    ///
359    /// ```rust
360    /// # use fallible_iterator::IteratorExt as _;
361    /// # use lender::prelude::*;
362    /// let a = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
363    ///     [1, 2].iter().into_fallible(),
364    /// );
365    /// let b = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
366    ///     [3, 4].iter().into_fallible(),
367    /// );
368    /// let mut zipped = a.zip(b);
369    /// assert_eq!(zipped.next(), Ok(Some((&1, &3))));
370    /// assert_eq!(zipped.next(), Ok(Some((&2, &4))));
371    /// assert_eq!(zipped.next(), Ok(None));
372    /// ```
373    #[inline(always)]
374    fn zip<U: IntoFallibleLender>(self, other: U) -> Zip<Self, <U as IntoFallibleLender>::FallibleLender>
375    where
376        Self: Sized,
377    {
378        let other = other.into_fallible_lender();
379        Zip::new_fallible(self, other)
380    }
381
382    /// Intersperses each lend of this lender with the given separator.
383    ///
384    /// # Examples
385    ///
386    /// ```rust
387    /// # use fallible_iterator::IteratorExt as _;
388    /// # use lender::prelude::*;
389    /// let sep = 0;
390    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
391    ///     [1, 2, 3].iter().into_fallible(),
392    /// );
393    /// let mut inter = lender.intersperse(&sep);
394    /// assert_eq!(inter.next(), Ok(Some(&1)));
395    /// assert_eq!(inter.next(), Ok(Some(&0)));
396    /// assert_eq!(inter.next(), Ok(Some(&2)));
397    /// assert_eq!(inter.next(), Ok(Some(&0)));
398    /// assert_eq!(inter.next(), Ok(Some(&3)));
399    /// assert_eq!(inter.next(), Ok(None));
400    /// ```
401    #[inline(always)]
402    fn intersperse<'call>(self, separator: FallibleLend<'call, Self>) -> FallibleIntersperse<'call, Self>
403    where
404        Self: Sized,
405        for<'all> FallibleLend<'all, Self>: Clone,
406    {
407        FallibleIntersperse::new(self, separator)
408    }
409
410    /// Intersperses each lend of this lender with the separator produced by
411    /// the given function.
412    ///
413    /// # Examples
414    ///
415    /// ```rust
416    /// # use fallible_iterator::IteratorExt as _;
417    /// # use lender::prelude::*;
418    /// let sep = 0;
419    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
420    ///     [1, 2, 3].iter().into_fallible(),
421    /// );
422    /// let mut inter = lender.intersperse_with(|| Ok(&sep));
423    /// assert_eq!(inter.next(), Ok(Some(&1)));
424    /// assert_eq!(inter.next(), Ok(Some(&0)));
425    /// assert_eq!(inter.next(), Ok(Some(&2)));
426    /// assert_eq!(inter.next(), Ok(Some(&0)));
427    /// assert_eq!(inter.next(), Ok(Some(&3)));
428    /// assert_eq!(inter.next(), Ok(None));
429    /// ```
430    #[inline(always)]
431    fn intersperse_with<'call, G>(self, separator: G) -> FallibleIntersperseWith<'call, Self, G>
432    where
433        Self: Sized,
434        G: FnMut() -> Result<FallibleLend<'call, Self>, Self::Error>,
435    {
436        FallibleIntersperseWith::new(self, separator)
437    }
438
439    /// Maps each lend of this lender using the given function.
440    ///
441    /// Note that functions passed to this method must be built using the
442    /// [`covar!`](crate::covar) or [`covar_mut!`](crate::covar_mut) macros, which also
443    /// checks for covariance of the returned type.
444    ///
445    /// # Examples
446    ///
447    /// ```rust
448    /// # use fallible_iterator::IteratorExt as _;
449    /// # use lender::prelude::*;
450    /// # use core::convert::Infallible;
451    /// let mut data = [1, 2];
452    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend mut i32), _>(
453    ///     data.iter_mut().into_fallible(),
454    /// );
455    /// let mut mapped = lender.map(covar_mut!(
456    ///     for<'all> |a: &'all mut i32| -> Result<&'all i32, Infallible> {
457    ///         *a += 1;
458    ///         Ok(&*a)
459    ///     }
460    /// ));
461    /// assert_eq!(mapped.next().unwrap(), Some(&2));
462    /// ```
463    #[inline(always)]
464    fn map<F>(self, f: Covar<F>) -> Map<Self, F>
465    where
466        Self: Sized,
467        F: for<'all> FnMutHKARes<'all, FallibleLend<'all, Self>, Self::Error>,
468    {
469        Map::new_fallible(self, f)
470    }
471
472    /// Maps the error of this lender using the given function.
473    ///
474    /// # Examples
475    ///
476    /// ```rust
477    /// # use lender::prelude::*;
478    /// let data = [Ok(1), Ok(2), Err("oops")];
479    /// let mut lender = data.into_iter().into_lender()
480    ///     .convert::<&str>()
481    ///     .map_err(|e| format!("error: {e}"));
482    /// assert_eq!(lender.next(), Ok(Some(1)));
483    /// assert_eq!(lender.next(), Ok(Some(2)));
484    /// assert_eq!(lender.next(), Err(String::from("error: oops")));
485    /// ```
486    #[inline(always)]
487    fn map_err<E, F>(self, f: F) -> MapErr<E, Self, F>
488    where
489        Self: Sized,
490        F: FnMut(Self::Error) -> E,
491    {
492        MapErr::new(self, f)
493    }
494
495    /// Maps each lend of this lender into an owned value using the given function.
496    ///
497    /// This is a weaker version of [`FallibleLender::map`] that returns a
498    /// [`FallibleIterator`](fallible_iterator::FallibleIterator) instead
499    /// of a [`FallibleLender`]. However, this behavior is very common, and so
500    /// this method is included for convenience. The main advantage is better
501    /// type inference for the mapping function.
502    ///
503    /// # Examples
504    ///
505    /// ```rust
506    /// # use fallible_iterator::{IteratorExt as _, FallibleIterator as _};
507    /// # use lender::prelude::*;
508    /// let mut data = [1, 2];
509    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend mut i32), _>(
510    ///     data.iter_mut().into_fallible(),
511    /// );
512    /// let mut mapped_into_iter = lender.map_into_iter(|a| { Ok(*a + 10) });
513    /// assert_eq!(mapped_into_iter.next(), Ok(Some(11)));
514    /// assert_eq!(mapped_into_iter.next(), Ok(Some(12)));
515    /// assert_eq!(mapped_into_iter.next(), Ok(None));
516    /// ```
517    #[inline(always)]
518    fn map_into_iter<O, F>(self, f: F) -> MapIntoIter<Self, O, F>
519    where
520        Self: Sized,
521        F: FnMut(FallibleLend<'_, Self>) -> Result<O, Self::Error>
522    {
523        MapIntoIter::new(self, f)
524    }
525
526    /// Calls the given function with each lend of this lender.
527    ///
528    /// # Examples
529    ///
530    /// ```rust
531    /// # use fallible_iterator::IteratorExt as _;
532    /// # use lender::prelude::*;
533    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
534    ///     [1, 2, 3].iter().into_fallible(),
535    /// );
536    /// let mut sum = 0;
537    /// lender.for_each(|&x| { sum += x; Ok(()) }).unwrap();
538    /// assert_eq!(sum, 6);
539    /// ```
540    #[inline(always)]
541    fn for_each<F>(self, mut f: F) -> Result<(), Self::Error>
542    where
543        Self: Sized,
544        F: FnMut(FallibleLend<'_, Self>) -> Result<(), Self::Error>,
545    {
546        self.fold((), |(), item| {
547            f(item)?;
548            Ok(())
549        })
550    }
551
552    /// Filters this lender using the given predicate.
553    ///
554    /// # Examples
555    ///
556    /// ```rust
557    /// # use fallible_iterator::IteratorExt as _;
558    /// # use lender::prelude::*;
559    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
560    ///     [1, 2, 3].iter().into_fallible(),
561    /// );
562    /// let mut filtered = lender.filter(|&&x| Ok(x > 1));
563    /// assert_eq!(filtered.next(), Ok(Some(&2)));
564    /// assert_eq!(filtered.next(), Ok(Some(&3)));
565    /// assert_eq!(filtered.next(), Ok(None));
566    /// ```
567    #[inline(always)]
568    fn filter<P>(self, predicate: P) -> Filter<Self, P>
569    where
570        Self: Sized,
571        P: FnMut(&FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
572    {
573        Filter::new_fallible(self, predicate)
574    }
575
576    /// Filters and maps this lender using the given function.
577    ///
578    /// Note that functions passed to this method must be built using the
579    /// [`covar!`](crate::covar) or [`covar_mut!`](crate::covar_mut) macros, which also
580    /// checks for covariance of the returned type.
581    ///
582    /// # Examples
583    ///
584    /// ```rust
585    /// # use fallible_iterator::IteratorExt as _;
586    /// # use lender::prelude::*;
587    /// # use core::convert::Infallible;
588    /// let mut data = [1, 2];
589    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend mut i32), _>(
590    ///     data.iter_mut().into_fallible(),
591    /// );
592    /// let mut filtered = lender.filter_map(covar_mut!(
593    ///     for<'all> |a: &'all mut i32| -> Result<Option<&'all i32>, Infallible> {
594    ///         if *a > 1 { Ok(Some(&*a)) } else { Ok(None) }
595    ///     }
596    /// ));
597    /// assert_eq!(filtered.next().unwrap(), Some(&2));
598    /// ```
599    #[inline(always)]
600    fn filter_map<F>(self, f: Covar<F>) -> FilterMap<Self, F>
601    where
602        Self: Sized,
603        F: for<'all> FnMutHKAResOpt<'all, FallibleLend<'all, Self>, Self::Error>,
604    {
605        FilterMap::new_fallible(self, f)
606    }
607
608    /// Enumerates this lender. Each lend is paired with its zero-based
609    /// index.
610    ///
611    /// # Examples
612    ///
613    /// ```rust
614    /// # use fallible_iterator::IteratorExt as _;
615    /// # use lender::prelude::*;
616    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
617    ///     [1, 2, 3].iter().into_fallible(),
618    /// );
619    /// let mut enumerated = lender.enumerate();
620    /// assert_eq!(enumerated.next(), Ok(Some((0, &1))));
621    /// assert_eq!(enumerated.next(), Ok(Some((1, &2))));
622    /// assert_eq!(enumerated.next(), Ok(Some((2, &3))));
623    /// assert_eq!(enumerated.next(), Ok(None));
624    /// ```
625    #[inline(always)]
626    fn enumerate(self) -> Enumerate<Self>
627    where
628        Self: Sized,
629    {
630        Enumerate::new_fallible(self)
631    }
632
633    /// Makes this lender peekable, so that it is possible to peek at the next
634    /// lend without consuming it.
635    ///
636    /// # Examples
637    ///
638    /// ```rust
639    /// # use fallible_iterator::IteratorExt as _;
640    /// # use lender::prelude::*;
641    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
642    ///     [1, 2].iter().into_fallible(),
643    /// );
644    /// let mut peekable = lender.peekable();
645    /// assert_eq!(peekable.peek(), Ok(Some(&&1)));
646    /// assert_eq!(peekable.next(), Ok(Some(&1)));
647    /// assert_eq!(peekable.peek(), Ok(Some(&&2)));
648    /// assert_eq!(peekable.next(), Ok(Some(&2)));
649    /// assert_eq!(peekable.peek(), Ok(None));
650    /// ```
651    #[inline(always)]
652    fn peekable<'call>(self) -> FalliblePeekable<'call, Self>
653    where
654        Self: Sized,
655    {
656        FalliblePeekable::new(self)
657    }
658
659    /// Skips the first contiguous sequence of lends of this lender that
660    /// satisfy the given predicate.
661    ///
662    /// # Examples
663    ///
664    /// ```rust
665    /// # use fallible_iterator::IteratorExt as _;
666    /// # use lender::prelude::*;
667    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
668    ///     [1, 2, 3].iter().into_fallible(),
669    /// );
670    /// let mut skipped = lender.skip_while(|&&x| Ok(x < 3));
671    /// assert_eq!(skipped.next(), Ok(Some(&3)));
672    /// assert_eq!(skipped.next(), Ok(None));
673    /// ```
674    #[inline(always)]
675    fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
676    where
677        Self: Sized,
678        P: FnMut(&FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
679    {
680        SkipWhile::new_fallible(self, predicate)
681    }
682
683    /// Takes the first contiguous sequence of lends of this lender that
684    /// satisfy the given predicate.
685    ///
686    /// # Examples
687    ///
688    /// ```rust
689    /// # use fallible_iterator::IteratorExt as _;
690    /// # use lender::prelude::*;
691    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
692    ///     [1, 2, 3].iter().into_fallible(),
693    /// );
694    /// let mut taken = lender.take_while(|&&x| Ok(x < 3));
695    /// assert_eq!(taken.next(), Ok(Some(&1)));
696    /// assert_eq!(taken.next(), Ok(Some(&2)));
697    /// assert_eq!(taken.next(), Ok(None));
698    /// ```
699    #[inline(always)]
700    fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
701    where
702        Self: Sized,
703        P: FnMut(&FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
704    {
705        TakeWhile::new_fallible(self, predicate)
706    }
707
708    /// Maps this lender using the given function while it returns [`Some`].
709    ///
710    /// Note that functions passed to this method must be built using the
711    /// [`covar!`](crate::covar) or [`covar_mut!`](crate::covar_mut) macros, which also
712    /// checks for covariance of the returned type.
713    ///
714    /// # Examples
715    ///
716    /// ```rust
717    /// # use fallible_iterator::IteratorExt as _;
718    /// # use lender::prelude::*;
719    /// # use core::convert::Infallible;
720    /// let mut data = [1, 2];
721    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend mut i32), _>(
722    ///     data.iter_mut().into_fallible(),
723    /// );
724    /// let mut mapped = lender.map_while(covar_mut!(
725    ///     for<'all> |a: &'all mut i32| -> Result<Option<&'all i32>, Infallible> {
726    ///         if *a < 2 { Ok(Some(&*a)) } else { Ok(None) }
727    ///     }
728    /// ));
729    /// assert_eq!(mapped.next().unwrap(), Some(&1));
730    /// assert_eq!(mapped.next().unwrap(), None);
731    /// ```
732    #[inline(always)]
733    fn map_while<P>(self, predicate: Covar<P>) -> MapWhile<Self, P>
734    where
735        Self: Sized,
736        P: for<'all> FnMutHKAResOpt<'all, FallibleLend<'all, Self>, Self::Error>,
737    {
738        MapWhile::new_fallible(self, predicate)
739    }
740
741    /// Skips the first `n` lends of this lender.
742    ///
743    /// # Examples
744    ///
745    /// ```rust
746    /// # use fallible_iterator::IteratorExt as _;
747    /// # use lender::prelude::*;
748    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
749    ///     [1, 2, 3].iter().into_fallible(),
750    /// );
751    /// let mut skipped = lender.skip(2);
752    /// assert_eq!(skipped.next(), Ok(Some(&3)));
753    /// assert_eq!(skipped.next(), Ok(None));
754    /// ```
755    #[inline(always)]
756    fn skip(self, n: usize) -> Skip<Self>
757    where
758        Self: Sized,
759    {
760        Skip::new_fallible(self, n)
761    }
762
763    /// Takes the first `n` lends of this lender.
764    ///
765    /// # Examples
766    ///
767    /// ```rust
768    /// # use fallible_iterator::IteratorExt as _;
769    /// # use lender::prelude::*;
770    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
771    ///     [1, 2, 3].iter().into_fallible(),
772    /// );
773    /// let mut taken = lender.take(2);
774    /// assert_eq!(taken.next(), Ok(Some(&1)));
775    /// assert_eq!(taken.next(), Ok(Some(&2)));
776    /// assert_eq!(taken.next(), Ok(None));
777    /// ```
778    #[inline(always)]
779    fn take(self, n: usize) -> Take<Self>
780    where
781        Self: Sized,
782    {
783        Take::new_fallible(self, n)
784    }
785
786    /// The [`FallibleLender`] version of [`Iterator::scan`].
787    ///
788    /// Note that functions passed to this method must be built using the
789    /// [`covar!`](crate::covar) or [`covar_mut!`](crate::covar_mut) macros, which also
790    /// checks for covariance of the returned type.
791    ///
792    /// # Examples
793    ///
794    /// ```rust
795    /// # use fallible_iterator::IteratorExt as _;
796    /// # use lender::prelude::*;
797    /// # use core::convert::Infallible;
798    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
799    ///     [1, 2, 3].iter().into_fallible(),
800    /// );
801    /// let mut scanned = lender.scan(
802    ///     0,
803    ///     covar_mut!(
804    ///         for<'all> |args: (&'all mut i32, &'all i32)|
805    ///             -> Result<Option<&'all i32>, Infallible>
806    ///         {
807    ///             *args.0 += *args.1;
808    ///             Ok(Some(args.1))
809    ///         }
810    ///     ),
811    /// );
812    /// assert_eq!(scanned.next().unwrap(), Some(&1));
813    /// assert_eq!(scanned.next().unwrap(), Some(&2));
814    /// ```
815    #[inline(always)]
816    fn scan<St, F>(self, initial_state: St, f: Covar<F>) -> Scan<Self, St, F>
817    where
818        Self: Sized,
819        F: for<'all> FnMutHKAResOpt<'all, (&'all mut St, FallibleLend<'all, Self>), Self::Error>,
820    {
821        Scan::new_fallible(self, initial_state, f)
822    }
823
824    /// The [`FallibleLender`] version of [`Iterator::flat_map`].
825    ///
826    /// Note that functions passed to this method must be built using the
827    /// [`covar!`](crate::covar) or [`covar_mut!`](crate::covar_mut) macros, which also
828    /// checks for covariance of the returned type.
829    ///
830    /// # Examples
831    ///
832    /// ```rust
833    /// # use lender::prelude::*;
834    /// # use core::convert::Infallible;
835    /// // Define a wrapper that implements FallibleLender
836    /// struct VecLender(Vec<i32>);
837    ///
838    /// impl<'lend> FallibleLending<'lend> for VecLender {
839    ///     type Lend = i32;
840    /// }
841    ///
842    /// impl FallibleLender for VecLender {
843    ///     type Error = Infallible;
844    ///     check_covariance_fallible!();
845    ///     fn next(&mut self) -> Result<Option<FallibleLend<'_, Self>>, Self::Error> {
846    ///         Ok(if self.0.is_empty() { None } else { Some(self.0.remove(0)) })
847    ///     }
848    /// }
849    ///
850    /// let data = [1, 2, 3];
851    /// let mut flat = data.into_iter().into_lender().into_fallible().flat_map(
852    ///     covar_mut!(for<'lend> |x: i32| -> Result<VecLender, Infallible> {
853    ///         Ok(VecLender(vec![x, x * 10]))
854    ///     })
855    /// );
856    /// assert_eq!(flat.next().unwrap(), Some(1));
857    /// assert_eq!(flat.next().unwrap(), Some(10));
858    /// assert_eq!(flat.next().unwrap(), Some(2));
859    /// ```
860    #[inline(always)]
861    fn flat_map<'call, F>(self, f: Covar<F>) -> FallibleFlatMap<'call, Self, F>
862    where
863        Self: Sized,
864        F: for<'all> FnMutHKARes<'all, FallibleLend<'all, Self>, Self::Error>,
865        for<'all> <F as FnMutHKARes<'all, FallibleLend<'all, Self>, Self::Error>>::B: IntoFallibleLender<Error = Self::Error>,
866    {
867        FallibleFlatMap::new(self, f)
868    }
869
870    /// The [`FallibleLender`] version of [`Iterator::flatten`].
871    ///
872    /// # Examples
873    ///
874    /// ```rust
875    /// # use lender::prelude::*;
876    /// # use core::convert::Infallible;
877    /// let data = [vec![1, 2], vec![3, 4]];
878    /// let lender = data.into_iter().into_lender()
879    ///     .into_fallible();
880    /// let mut flat = lender.map(covar!(
881    ///     for<'all> |v: Vec<i32>|
882    ///         -> Result<lender::IntoFallible<lender::FromIter<
883    ///             std::vec::IntoIter<i32>
884    ///         >>, Infallible>
885    ///     {
886    ///         Ok(v.into_iter().into_lender().into_fallible())
887    ///     }
888    /// )).flatten();
889    /// assert_eq!(flat.next().unwrap(), Some(1));
890    /// assert_eq!(flat.next().unwrap(), Some(2));
891    /// assert_eq!(flat.next().unwrap(), Some(3));
892    /// assert_eq!(flat.next().unwrap(), Some(4));
893    /// assert_eq!(flat.next().unwrap(), None);
894    /// ```
895    #[inline(always)]
896    fn flatten<'call>(self) -> FallibleFlatten<'call, Self>
897    where
898        Self: Sized,
899        for<'all> FallibleLend<'all, Self>: IntoFallibleLender<Error = Self::Error>,
900    {
901        FallibleFlatten::new(self)
902    }
903
904    /// The [`FallibleLender`] version of [`Iterator::fuse`].
905    ///
906    /// # Examples
907    ///
908    /// ```rust
909    /// # use fallible_iterator::IteratorExt as _;
910    /// # use lender::prelude::*;
911    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
912    ///     [1, 2].iter().into_fallible(),
913    /// );
914    /// let mut fused = lender.fuse();
915    /// assert_eq!(fused.next(), Ok(Some(&1)));
916    /// assert_eq!(fused.next(), Ok(Some(&2)));
917    /// assert_eq!(fused.next(), Ok(None));
918    /// assert_eq!(fused.next(), Ok(None));
919    /// ```
920    #[inline(always)]
921    fn fuse(self) -> Fuse<Self>
922    where
923        Self: Sized,
924    {
925        Fuse::new_fallible(self)
926    }
927
928    /// The [`FallibleLender`] version of [`Iterator::inspect`].
929    ///
930    /// # Examples
931    ///
932    /// ```rust
933    /// # use fallible_iterator::IteratorExt as _;
934    /// # use lender::prelude::*;
935    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
936    ///     [1, 2, 3].iter().into_fallible(),
937    /// );
938    /// let mut sum = 0;
939    /// let mut inspected = lender.inspect(|&x| { sum += x; Ok(()) });
940    /// assert_eq!(inspected.next(), Ok(Some(&1)));
941    /// assert_eq!(inspected.next(), Ok(Some(&2)));
942    /// assert_eq!(inspected.next(), Ok(Some(&3)));
943    /// assert_eq!(inspected.next(), Ok(None));
944    /// assert_eq!(sum, 6);
945    /// ```
946    #[inline(always)]
947    fn inspect<F>(self, f: F) -> Inspect<Self, F>
948    where
949        Self: Sized,
950        F: FnMut(&FallibleLend<'_, Self>) -> Result<(), Self::Error>,
951    {
952        Inspect::new_fallible(self, f)
953    }
954
955    // not std::iter
956    /// Mutates each lend with the given function.
957    ///
958    /// # Examples
959    ///
960    /// ```rust
961    /// # use fallible_iterator::IteratorExt as _;
962    /// # use lender::prelude::*;
963    /// let mut data = [1, 2, 3];
964    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend mut i32), _>(
965    ///     data.iter_mut().into_fallible(),
966    /// );
967    /// let mut mutated = lender.mutate(|x| { **x += 10; Ok(()) });
968    /// assert_eq!(mutated.next(), Ok(Some(&mut 11)));
969    /// assert_eq!(mutated.next(), Ok(Some(&mut 12)));
970    /// assert_eq!(mutated.next(), Ok(Some(&mut 13)));
971    /// assert_eq!(mutated.next(), Ok(None));
972    /// ```
973    #[inline(always)]
974    fn mutate<F>(self, f: F) -> Mutate<Self, F>
975    where
976        Self: Sized,
977        F: FnMut(&mut FallibleLend<'_, Self>) -> Result<(), Self::Error>,
978    {
979        Mutate::new_fallible(self, f)
980    }
981
982    /// The [`FallibleLender`] version of
983    /// [`Iterator::by_ref`].
984    ///
985    /// # Examples
986    ///
987    /// ```rust
988    /// # use lender::prelude::*;
989    /// let data = [1, 2, 3, 4, 5];
990    /// let mut lender =
991    ///     data.iter().into_lender().into_fallible();
992    /// // Consume two elements through by_ref.
993    /// assert_eq!(
994    ///     lender.by_ref().next(),
995    ///     Ok(Some(&1))
996    /// );
997    /// assert_eq!(
998    ///     lender.by_ref().next(),
999    ///     Ok(Some(&2))
1000    /// );
1001    /// // The original lender continues from where
1002    /// // we left off.
1003    /// assert_eq!(lender.next(), Ok(Some(&3)));
1004    /// ```
1005    #[inline(always)]
1006    fn by_ref(&mut self) -> &mut Self
1007    where
1008        Self: Sized,
1009    {
1010        self
1011    }
1012
1013    /// Transforms the fallible lender into a collection.
1014    /// If any invocation of next returns Err, returns the collection built
1015    /// from values yielded successfully, together with the error.
1016    ///
1017    /// # Error Handling
1018    ///
1019    /// The return type `Result<B, (B, Self::Error)>` preserves partial
1020    /// results even on error: the `B` inside the `Err` variant contains
1021    /// whatever was accumulated before the error occurred.
1022    ///
1023    /// # Examples
1024    ///
1025    /// ```rust
1026    /// # use fallible_iterator::{IteratorExt as _, FallibleIterator as _};
1027    /// # use lender::prelude::*;
1028    /// let lender = [1, 2, 3].into_iter().into_lender().into_fallible();
1029    /// let collected: Result<Vec<i32>, _> = lender.owned().collect();
1030    /// assert_eq!(collected, Ok(vec![1, 2, 3]));
1031    /// ```
1032    #[inline(always)]
1033    fn collect<B>(self) -> Result<B, (B, Self::Error)>
1034    where
1035        Self: Sized,
1036        for<'all> B: FromLender<NonFallibleAdapter<'all, Self>>,
1037    {
1038        non_fallible_adapter::process(self, |lender| B::from_lender(lender))
1039    }
1040
1041    /// Collects the lends of a fallible lender that are themselves [`Try`] types
1042    /// into a collection of their outputs, short-circuiting on both lender errors
1043    /// and `Try` failures.
1044    ///
1045    /// The [`FallibleLender`] version of
1046    /// [`Lender::try_collect`](crate::Lender::try_collect).
1047    ///
1048    /// On error, returns the collection (with partial results) together with
1049    /// the error.
1050    #[inline(always)]
1051    fn try_collect<'a, B, T>(&'a mut self) -> Result<T, (T, Self::Error)>
1052    where
1053        Self: Sized,
1054        for<'all> FallibleLend<'all, Self>: Try,
1055        for<'all> <FallibleLend<'all, Self> as Try>::Residual: Residual<B, TryType = T>,
1056        for<'b, 'c, 'd> B: FromLender<FallibleTryShuntAdapter<'b, 'c, 'd, 'a, Self>>,
1057    {
1058        non_fallible_adapter::process(self, |mut lender| {
1059            crate::Lender::try_collect(&mut lender)
1060        })
1061    }
1062
1063    /// Extends an existing collection with lends from this fallible lender.
1064    ///
1065    /// The [`FallibleLender`] version of
1066    /// [`Lender::collect_into`](crate::Lender::collect_into).
1067    /// On error, returns the collection (with partial results) together with
1068    /// the error.
1069    #[inline]
1070    fn collect_into<E>(self, collection: &mut E) -> Result<&mut E, (&mut E, Self::Error)>
1071    where
1072        Self: Sized,
1073        for<'all> E: ExtendLender<NonFallibleAdapter<'all, Self>>,
1074    {
1075        match non_fallible_adapter::process(self, |lender|
1076            collection.extend_lender(lender)
1077        ) {
1078            Ok(()) => Ok(collection),
1079            Err(((), err)) => Err((collection, err))
1080        }
1081    }
1082
1083    /// The [`FallibleLender`] version of [`Iterator::partition`].
1084    ///
1085    /// On error, returns the partial results accumulated so far together
1086    /// with the error, matching the convention used by
1087    /// [`collect`](FallibleLender::collect).
1088    #[inline]
1089    #[allow(clippy::type_complexity)]
1090    fn partition<'this, E, F>(mut self, mut f: F) -> Result<(E, E), ((E, E), Self::Error)>
1091    where
1092        Self: Sized + 'this,
1093        E: Default + ExtendLender<NonFallibleAdapter<'this, Self>>,
1094        F: FnMut(&FallibleLend<'_, Self>) -> Result<bool, Self::Error>
1095    {
1096        let mut left = E::default();
1097        let mut right = E::default();
1098        loop {
1099            match self.next() {
1100                Ok(Some(x)) => match f(&x) {
1101                    Ok(true) => left.extend_lender_one(x),
1102                    Ok(false) => right.extend_lender_one(x),
1103                    Err(e) => return Err(((left, right), e)),
1104                },
1105                Ok(None) => return Ok((left, right)),
1106                Err(e) => return Err(((left, right), e)),
1107            }
1108        }
1109    }
1110
1111    /// The [`FallibleLender`] version of [`Iterator::is_partitioned`].
1112    ///
1113    /// # Examples
1114    ///
1115    /// ```rust
1116    /// # use fallible_iterator::IteratorExt as _;
1117    /// # use lender::prelude::*;
1118    /// // [1, 3, 2, 4] is partitioned: all odd elements come before all even.
1119    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1120    ///     [1, 3, 2, 4].iter().into_fallible(),
1121    /// );
1122    /// assert!(lender.is_partitioned(|&x| Ok(x % 2 != 0)).unwrap());
1123    /// ```
1124    #[inline]
1125    #[allow(clippy::wrong_self_convention)]
1126    fn is_partitioned<P>(mut self, mut predicate: P) -> Result<bool, Self::Error>
1127    where
1128        Self: Sized,
1129        P: FnMut(FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
1130    {
1131        Ok(self.all(&mut predicate)? || !self.any(predicate)?)
1132    }
1133
1134    /// The [`FallibleLender`] version of [`Iterator::try_fold`].
1135    ///
1136    /// # Examples
1137    ///
1138    /// ```rust
1139    /// # use fallible_iterator::IteratorExt as _;
1140    /// # use lender::prelude::*;
1141    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1142    ///     [1, 2, 3].iter().into_fallible(),
1143    /// );
1144    /// let sum = lender.try_fold(0, |acc: i32, &x| Ok(acc.checked_add(x)));
1145    /// assert_eq!(sum, Ok(Some(6)));
1146    /// ```
1147    #[inline]
1148    fn try_fold<B, F, R>(&mut self, mut init: B, mut f: F) -> Result<R, Self::Error>
1149    where
1150        F: FnMut(B, FallibleLend<'_, Self>) -> Result<R, Self::Error>,
1151        R: Try<Output = B>
1152    {
1153        while let Some(v) = self.next()? {
1154            match f(init, v)?.branch() {
1155                ControlFlow::Break(residual) => return Ok(R::from_residual(residual)),
1156                ControlFlow::Continue(output) => init = output
1157            }
1158        }
1159        Ok(R::from_output(init))
1160    }
1161
1162    /// The [`FallibleLender`] version of [`Iterator::try_for_each`].
1163    ///
1164    /// # Examples
1165    ///
1166    /// ```rust
1167    /// # use fallible_iterator::IteratorExt as _;
1168    /// # use lender::prelude::*;
1169    /// let mut lender =
1170    ///     lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1171    ///         [1, 2, 3].iter().into_fallible(),
1172    ///     );
1173    /// let result = lender.try_for_each(|&x| {
1174    ///     if x < 3 { Ok(Some(())) } else { Ok(None) }
1175    /// });
1176    /// assert_eq!(result, Ok(None));
1177    /// ```
1178    #[inline(always)]
1179    fn try_for_each<F, R>(&mut self, mut f: F) -> Result<R, Self::Error>
1180    where
1181        F: FnMut(FallibleLend<'_, Self>) -> Result<R, Self::Error>,
1182        R: Try<Output = ()>,
1183    {
1184        self.try_fold((), move |(), x| f(x))
1185    }
1186
1187    /// The [`FallibleLender`] version of [`Iterator::fold`].
1188    ///
1189    /// # Examples
1190    ///
1191    /// ```rust
1192    /// # use fallible_iterator::IteratorExt as _;
1193    /// # use lender::prelude::*;
1194    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1195    ///     [1, 2, 3].iter().into_fallible(),
1196    /// );
1197    /// let sum = lender.fold(0, |acc, &x| Ok(acc + x));
1198    /// assert_eq!(sum, Ok(6));
1199    /// ```
1200    ///
1201    /// ```rust
1202    /// # use fallible_iterator::IteratorExt as _;
1203    /// # use lender::prelude::*;
1204    /// // Example concatenating strings
1205    /// let data = ["hello", " ", "world"];
1206    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&&'lend str), _>(
1207    ///     data.iter().into_fallible(),
1208    /// );
1209    /// let result = lender.fold(String::new(), |mut acc, &s| {
1210    ///     acc.push_str(s);
1211    ///     Ok(acc)
1212    /// });
1213    /// assert_eq!(result, Ok(String::from("hello world")));
1214    /// ```
1215    #[inline]
1216    fn fold<B, F>(mut self, init: B, mut f: F) -> Result<B, Self::Error>
1217    where
1218        Self: Sized,
1219        F: FnMut(B, FallibleLend<'_, Self>) -> Result<B, Self::Error>,
1220    {
1221        self.try_fold(init, |acc, item| f(acc, item).map(NeverShortCircuit))
1222            .map(|res| res.0)
1223    }
1224
1225    /// The [`FallibleLender`] version of [`Iterator::reduce`].
1226    ///
1227    /// # Error Handling
1228    ///
1229    /// If the closure or the underlying lender returns an error, `reduce`
1230    /// propagates it immediately. Unlike [`collect`](FallibleLender::collect),
1231    /// the partial accumulation is not preserved on error.
1232    #[inline]
1233    fn reduce<T, F>(mut self, f: F) -> Result<Option<T>, Self::Error>
1234    where
1235        Self: Sized,
1236        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1237        F: FnMut(T, FallibleLend<'_, Self>) -> Result<T, Self::Error>
1238    {
1239        let Some(first) = self.next()?.map(|first| first.to_owned()) else {
1240            return Ok(None)
1241        };
1242        self.fold(first, f).map(Some)
1243    }
1244
1245    /// The [`FallibleLender`] version of [`Iterator::try_reduce`].
1246    ///
1247    /// # Examples
1248    ///
1249    /// ```rust
1250    /// # use lender::prelude::*;
1251    /// let lender =
1252    ///     [1, 2, 3].into_iter().into_lender().into_fallible();
1253    /// let sum = lender.try_reduce(|acc: i32, x| {
1254    ///     Ok(acc.checked_add(x))
1255    /// });
1256    /// assert_eq!(sum, Ok(Some(Some(6))));
1257    /// ```
1258    #[inline]
1259    fn try_reduce<T, F, R>(mut self, f: F) -> Result<ChangeOutputType<R, Option<T>>, Self::Error>
1260    where
1261        Self: Sized,
1262        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1263        F: FnMut(T, FallibleLend<'_, Self>) -> Result<R, Self::Error>,
1264        R: Try<Output = T>,
1265        R::Residual: Residual<Option<T>>,
1266    {
1267        let first = match self.next()? {
1268            Some(ref x) => x.to_owned(),
1269            None => return Ok(Try::from_output(None)),
1270        };
1271        match self.try_fold(first, f)?.branch() {
1272            ControlFlow::Break(x) => Ok(FromResidual::from_residual(x)),
1273            ControlFlow::Continue(x) => Ok(Try::from_output(Some(x))),
1274        }
1275    }
1276
1277    /// The [`FallibleLender`] version of [`Iterator::all`].
1278    ///
1279    /// # Examples
1280    ///
1281    /// ```rust
1282    /// # use fallible_iterator::IteratorExt as _;
1283    /// # use lender::prelude::*;
1284    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1285    ///     [1, 2, 3].iter().into_fallible(),
1286    /// );
1287    /// assert_eq!(lender.all(|&x| Ok(x > 0)), Ok(true));
1288    /// ```
1289    ///
1290    /// ```rust
1291    /// # use fallible_iterator::IteratorExt as _;
1292    /// # use lender::prelude::*;
1293    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1294    ///     [1, 2, 3].iter().into_fallible(),
1295    /// );
1296    /// assert_eq!(lender.all(|&x| Ok(x > 2)), Ok(false));
1297    /// ```
1298    #[inline]
1299    fn all<F>(&mut self, mut f: F) -> Result<bool, Self::Error>
1300    where
1301        F: FnMut(FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
1302    {
1303        while let Some(x) = self.next()? {
1304            if !f(x)? {
1305                return Ok(false);
1306            }
1307        }
1308        Ok(true)
1309    }
1310
1311    /// The [`FallibleLender`] version of [`Iterator::any`].
1312    ///
1313    /// # Examples
1314    ///
1315    /// ```rust
1316    /// # use fallible_iterator::IteratorExt as _;
1317    /// # use lender::prelude::*;
1318    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1319    ///     [1, 2, 3].iter().into_fallible(),
1320    /// );
1321    /// assert_eq!(lender.any(|&x| Ok(x == 2)), Ok(true));
1322    /// ```
1323    ///
1324    /// ```rust
1325    /// # use fallible_iterator::IteratorExt as _;
1326    /// # use lender::prelude::*;
1327    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1328    ///     [1, 2, 3].iter().into_fallible(),
1329    /// );
1330    /// assert_eq!(lender.any(|&x| Ok(x > 5)), Ok(false));
1331    /// ```
1332    #[inline]
1333    fn any<F>(&mut self, mut f: F) -> Result<bool, Self::Error>
1334    where
1335        F: FnMut(FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
1336    {
1337        while let Some(x) = self.next()? {
1338            if f(x)? {
1339                return Ok(true);
1340            }
1341        }
1342        Ok(false)
1343    }
1344
1345    /// The [`FallibleLender`] version of [`Iterator::find`].
1346    ///
1347    /// # Examples
1348    ///
1349    /// ```rust
1350    /// # use fallible_iterator::IteratorExt as _;
1351    /// # use lender::prelude::*;
1352    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1353    ///     [1, 2, 3].iter().into_fallible(),
1354    /// );
1355    /// assert_eq!(lender.find(|&&x| Ok(x == 2)), Ok(Some(&2)));
1356    /// ```
1357    ///
1358    /// ```rust
1359    /// # use fallible_iterator::IteratorExt as _;
1360    /// # use lender::prelude::*;
1361    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1362    ///     [1, 2, 3].iter().into_fallible(),
1363    /// );
1364    /// assert_eq!(lender.find(|&&x| Ok(x > 10)), Ok(None));
1365    /// ```
1366    #[inline]
1367    fn find<P>(&mut self, mut predicate: P) -> Result<Option<FallibleLend<'_, Self>>, Self::Error>
1368    where
1369        P: FnMut(&FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
1370    {
1371        while let Some(x) = self.next()? {
1372            if predicate(&x)? {
1373                // SAFETY: polonius return
1374                return Ok(Some(unsafe {
1375                    core::mem::transmute::<
1376                        FallibleLend<'_, Self>,
1377                        FallibleLend<'_, Self>
1378                    >(x)
1379                }));
1380            }
1381        }
1382        Ok(None)
1383    }
1384
1385    /// The [`FallibleLender`] version of [`Iterator::find_map`].
1386    ///
1387    /// # Examples
1388    ///
1389    /// ```rust
1390    /// # use lender::prelude::*;
1391    /// let mut lender =
1392    ///     [1, 2, 3].into_iter().into_lender().into_fallible();
1393    /// let found = lender.find_map(|x: i32| {
1394    ///     Ok(if x > 1 { Some(x * 10) } else { None })
1395    /// });
1396    /// assert_eq!(found, Ok(Some(20)));
1397    /// ```
1398    #[allow(clippy::type_complexity)]
1399    #[inline]
1400    fn find_map<'a, F>(&'a mut self, mut f: F) -> Result<Option<<F as FnMutHKAResOpt<'a, FallibleLend<'a, Self>, Self::Error>>::B>, Self::Error>
1401    where
1402        Self: Sized,
1403        F: for<'all> FnMutHKAResOpt<'all, FallibleLend<'all, Self>, Self::Error>,
1404    {
1405        while let Some(x) = self.next()? {
1406            if let Some(y) = f(x)? {
1407                return Ok(Some(
1408                    // SAFETY: polonius return
1409                    unsafe {
1410                        core::mem::transmute::<
1411                            <F as FnMutHKAResOpt<'_, FallibleLend<'_, Self>, Self::Error>>::B,
1412                            <F as FnMutHKAResOpt<'a, FallibleLend<'a, Self>, Self::Error>>::B
1413                        >(y)
1414                    }
1415                ));
1416            }
1417        }
1418        Ok(None)
1419    }
1420
1421    /// The [`FallibleLender`] version of [`Iterator::try_find`].
1422    ///
1423    /// # Examples
1424    ///
1425    /// ```rust
1426    /// # use fallible_iterator::IteratorExt as _;
1427    /// # use lender::prelude::*;
1428    /// let mut lender =
1429    ///     lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1430    ///         [1, 2, 3].iter().into_fallible(),
1431    ///     );
1432    /// let result =
1433    ///     lender.try_find(|&x| Ok(Some(*x > 1)));
1434    /// assert_eq!(result, Ok(Some(Some(&2))));
1435    /// ```
1436    #[inline]
1437    fn try_find<F, R>(&mut self, mut f: F) -> Result<ChangeOutputType<R, Option<FallibleLend<'_, Self>>>, Self::Error>
1438    where
1439        Self: Sized,
1440        F: FnMut(&FallibleLend<'_, Self>) -> Result<R, Self::Error>,
1441        R: Try<Output = bool>,
1442        for<'all> R::Residual: Residual<Option<FallibleLend<'all, Self>>>,
1443    {
1444        while let Some(x) = self.next()? {
1445            match f(&x)?.branch() {
1446                ControlFlow::Break(x) => return Ok(<ChangeOutputType<R, Option<FallibleLend<'_, Self>>>>::from_residual(x)),
1447                ControlFlow::Continue(cond) => {
1448                    if cond {
1449                        return Ok(<ChangeOutputType<R, Option<FallibleLend<'_, Self>>>>::from_output(
1450                            Some(
1451                                // SAFETY: polonius return
1452                                unsafe {
1453                                    core::mem::transmute::<
1454                                        FallibleLend<'_, Self>,
1455                                        FallibleLend<'_, Self>
1456                                    >(x)
1457                                }
1458                            )
1459                        ));
1460                    }
1461                }
1462            }
1463        }
1464        Ok(<ChangeOutputType<R, Option<FallibleLend<'_, Self>>>>::from_output(None))
1465    }
1466
1467    /// The [`FallibleLender`] version of [`Iterator::position`].
1468    ///
1469    /// # Examples
1470    ///
1471    /// ```rust
1472    /// # use fallible_iterator::IteratorExt as _;
1473    /// # use lender::prelude::*;
1474    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1475    ///     [1, 2, 3].iter().into_fallible(),
1476    /// );
1477    /// assert_eq!(lender.position(|&x| Ok(x == 2)), Ok(Some(1)));
1478    /// ```
1479    ///
1480    /// ```rust
1481    /// # use fallible_iterator::IteratorExt as _;
1482    /// # use lender::prelude::*;
1483    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1484    ///     [1, 2, 3].iter().into_fallible(),
1485    /// );
1486    /// assert_eq!(lender.position(|&x| Ok(x > 10)), Ok(None));
1487    /// ```
1488    #[inline]
1489    fn position<P>(&mut self, mut predicate: P) -> Result<Option<usize>, Self::Error>
1490    where
1491        Self: Sized,
1492        P: FnMut(FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
1493    {
1494        let mut i = 0;
1495        while let Some(x) = self.next()? {
1496            if predicate(x)? {
1497                return Ok(Some(i));
1498            }
1499            i += 1;
1500        }
1501        Ok(None)
1502    }
1503
1504    /// The [`FallibleLender`] version of [`Iterator::rposition`].
1505    ///
1506    /// # Examples
1507    ///
1508    /// ```rust
1509    /// # use lender::prelude::*;
1510    /// let mut lender =
1511    ///     [1, 2, 3, 2, 1].iter().into_lender().into_fallible();
1512    /// assert_eq!(
1513    ///     lender.rposition(|&x| Ok(x == 2)),
1514    ///     Ok(Some(3))
1515    /// );
1516    /// ```
1517    #[inline]
1518    fn rposition<P>(&mut self, mut predicate: P) -> Result<Option<usize>, Self::Error>
1519    where
1520        P: FnMut(FallibleLend<'_, Self>) -> Result<bool, Self::Error>,
1521        Self: Sized + ExactSizeFallibleLender + DoubleEndedFallibleLender,
1522    {
1523        match self.try_rfold(self.len(), |i, x| {
1524            let i = i - 1;
1525            if predicate(x)? { Ok(ControlFlow::Break(i)) } else { Ok(ControlFlow::Continue(i)) }
1526        })? {
1527            ControlFlow::Continue(_) => Ok(None),
1528            ControlFlow::Break(x) => Ok(Some(x)),
1529        }
1530    }
1531
1532    /// The [`FallibleLender`] version of [`Iterator::max`].
1533    ///
1534    /// # Examples
1535    ///
1536    /// ```rust
1537    /// # use lender::prelude::*;
1538    /// let lender =
1539    ///     [1, 3, 2].into_iter().into_lender().into_fallible();
1540    /// assert_eq!(lender.max(), Ok(Some(3)));
1541    /// ```
1542    #[inline(always)]
1543    fn max<T: Ord>(self) -> Result<Option<T>, Self::Error>
1544    where
1545        Self: Sized,
1546        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1547    {
1548        fallible_iterator::FallibleIterator::max(self.owned())
1549    }
1550
1551    /// The [`FallibleLender`] version of [`Iterator::min`].
1552    ///
1553    /// # Examples
1554    ///
1555    /// ```rust
1556    /// # use lender::prelude::*;
1557    /// let lender =
1558    ///     [3, 1, 2].into_iter().into_lender().into_fallible();
1559    /// assert_eq!(lender.min(), Ok(Some(1)));
1560    /// ```
1561    #[inline(always)]
1562    fn min<T: Ord>(self) -> Result<Option<T>, Self::Error>
1563    where
1564        Self: Sized,
1565        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1566    {
1567        fallible_iterator::FallibleIterator::min(self.owned())
1568    }
1569
1570    /// The [`FallibleLender`] version of [`Iterator::max_by_key`].
1571    ///
1572    /// # Examples
1573    ///
1574    /// ```rust
1575    /// # use lender::prelude::*;
1576    /// let lender =
1577    ///     ["a", "bbb", "cc"].into_iter().into_lender().into_fallible();
1578    /// assert_eq!(lender.max_by_key(|s| Ok(s.len())), Ok(Some("bbb")));
1579    /// ```
1580    #[inline(always)]
1581    fn max_by_key<B: Ord, T, F>(self, f: F) -> Result<Option<T>, Self::Error>
1582    where
1583        Self: Sized,
1584        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1585        F: FnMut(&T) -> Result<B, Self::Error>,
1586    {
1587        fallible_iterator::FallibleIterator::max_by_key(self.owned(), f)
1588    }
1589
1590    /// The [`FallibleLender`] version of [`Iterator::max_by`].
1591    ///
1592    /// # Examples
1593    ///
1594    /// ```rust
1595    /// # use lender::prelude::*;
1596    /// let lender =
1597    ///     ["a", "bbb", "cc"].into_iter().into_lender().into_fallible();
1598    /// assert_eq!(
1599    ///     lender.max_by(|x, y| Ok(x.len().cmp(&y.len()))),
1600    ///     Ok(Some("bbb"))
1601    /// );
1602    /// ```
1603    #[inline(always)]
1604    fn max_by<T, F>(self, mut compare: F) -> Result<Option<T>, Self::Error>
1605    where
1606        Self: Sized,
1607        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1608        F: FnMut(&T, &FallibleLend<'_, Self>) -> Result<Ordering, Self::Error>
1609    {
1610        self.reduce(move |x, y| Ok(
1611            match compare(&x, &y)? {
1612                Ordering::Greater => x,
1613                _ => y.to_owned(),
1614            }
1615        ))
1616    }
1617
1618    /// The [`FallibleLender`] version of [`Iterator::min_by_key`].
1619    ///
1620    /// # Examples
1621    ///
1622    /// ```rust
1623    /// # use lender::prelude::*;
1624    /// let lender =
1625    ///     ["a", "bbb", "cc"].into_iter().into_lender().into_fallible();
1626    /// assert_eq!(lender.min_by_key(|s| Ok(s.len())), Ok(Some("a")));
1627    /// ```
1628    #[inline(always)]
1629    fn min_by_key<B: Ord, T, F>(self, f: F) -> Result<Option<T>, Self::Error>
1630    where
1631        Self: Sized,
1632        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1633        F: FnMut(&T) -> Result<B, Self::Error>,
1634    {
1635        fallible_iterator::FallibleIterator::min_by_key(self.owned(), f)
1636    }
1637
1638    /// The [`FallibleLender`] version of [`Iterator::min_by`].
1639    ///
1640    /// # Examples
1641    ///
1642    /// ```rust
1643    /// # use lender::prelude::*;
1644    /// let lender =
1645    ///     ["a", "bbb", "cc"].into_iter().into_lender().into_fallible();
1646    /// assert_eq!(
1647    ///     lender.min_by(|x, y| Ok(x.len().cmp(&y.len()))),
1648    ///     Ok(Some("a"))
1649    /// );
1650    /// ```
1651    #[inline(always)]
1652    fn min_by<T, F>(self, mut compare: F) -> Result<Option<T>, Self::Error>
1653    where
1654        Self: Sized,
1655        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
1656        F: FnMut(&T, &FallibleLend<'_, Self>) -> Result<Ordering, Self::Error>,
1657    {
1658        self.reduce(move |x, y| Ok(
1659            match compare(&x, &y)? {
1660                Ordering::Greater => y.to_owned(),
1661                _ => x,
1662            }
1663        ))
1664    }
1665
1666    /// The [`FallibleLender`] version of [`Iterator::rev`].
1667    ///
1668    /// # Examples
1669    ///
1670    /// ```rust
1671    /// # use fallible_iterator::IteratorExt as _;
1672    /// # use lender::prelude::*;
1673    /// let mut lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1674    ///     [1, 2, 3].iter().into_fallible(),
1675    /// )
1676    /// .rev();
1677    /// assert_eq!(lender.next(), Ok(Some(&3)));
1678    /// assert_eq!(lender.next(), Ok(Some(&2)));
1679    /// assert_eq!(lender.next(), Ok(Some(&1)));
1680    /// assert_eq!(lender.next(), Ok(None));
1681    /// ```
1682    #[inline(always)]
1683    fn rev(self) -> Rev<Self>
1684    where
1685        Self: Sized + DoubleEndedFallibleLender,
1686    {
1687        Rev::new_fallible(self)
1688    }
1689
1690    /// The [`FallibleLender`] version of [`Iterator::unzip`].
1691    #[inline(always)]
1692    fn unzip<ExtA, ExtB>(self) -> Result<(ExtA, ExtB), Self::Error>
1693    where
1694        Self: Sized,
1695        for<'all> FallibleLend<'all, Self>: TupleLend<'all>,
1696        ExtA: Default + for<'this> ExtendLender<NonFallibleAdapter<'this,
1697            <FirstShunt<Self> as IntoFallibleLender>::FallibleLender,
1698        >>,
1699        ExtB: Default + for<'this> ExtendLender<NonFallibleAdapter<'this,
1700            <SecondShunt<Self> as IntoFallibleLender>::FallibleLender,
1701        >>, {
1702        fallible_unzip(self)
1703    }
1704
1705    /// The [`FallibleLender`] version of [`Iterator::copied`].
1706    ///
1707    /// Turns this [`FallibleLender`] into a
1708    /// [`FallibleIterator`](fallible_iterator::FallibleIterator).
1709    ///
1710    /// # Examples
1711    ///
1712    /// ```rust
1713    /// # use fallible_iterator::{IteratorExt as _, FallibleIterator};
1714    /// # use lender::prelude::*;
1715    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1716    ///     [1, 2, 3].iter().into_fallible(),
1717    /// );
1718    /// let mut copied = lender.copied();
1719    /// assert_eq!(copied.next()?, Some(1));
1720    /// assert_eq!(copied.next()?, Some(2));
1721    /// assert_eq!(copied.next()?, Some(3));
1722    /// assert_eq!(copied.next()?, None);
1723    /// # Ok::<(), core::convert::Infallible>(())
1724    /// ```
1725    #[inline(always)]
1726    fn copied<T>(self) -> Copied<Self>
1727    where
1728        Self: Sized + for<'all> FallibleLending<'all, Lend = &'all T>,
1729        T: Copy,
1730    {
1731        Copied::new(self)
1732    }
1733
1734    /// The [`FallibleLender`] version of [`Iterator::cloned`].
1735    ///
1736    /// Turns this [`FallibleLender`] into a
1737    /// [`FallibleIterator`](fallible_iterator::FallibleIterator).
1738    ///
1739    /// # Examples
1740    ///
1741    /// ```rust
1742    /// # use fallible_iterator::{IteratorExt as _, FallibleIterator};
1743    /// # use lender::prelude::*;
1744    /// let lender = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1745    ///     [1, 2, 3].iter().into_fallible(),
1746    /// );
1747    /// let mut cloned = lender.cloned();
1748    /// assert_eq!(cloned.next()?, Some(1));
1749    /// assert_eq!(cloned.next()?, Some(2));
1750    /// assert_eq!(cloned.next()?, Some(3));
1751    /// assert_eq!(cloned.next()?, None);
1752    /// # Ok::<(), core::convert::Infallible>(())
1753    /// ```
1754    #[inline(always)]
1755    fn cloned<T>(self) -> Cloned<Self>
1756    where
1757        Self: Sized + for<'all> FallibleLending<'all, Lend = &'all T>,
1758        T: Clone,
1759    {
1760        Cloned::new(self)
1761    }
1762
1763    // not std::iter
1764    /// Turns this [`FallibleLender`] into a
1765    /// [`FallibleIterator`](fallible_iterator::FallibleIterator).
1766    ///
1767    /// # Examples
1768    ///
1769    /// ```rust
1770    /// # use fallible_iterator::{IteratorExt as _, FallibleIterator};
1771    /// # use lender::prelude::*;
1772    /// let mut owned = [1, 2, 3].into_iter().into_lender().into_fallible().owned();
1773    /// assert_eq!(owned.next()?, Some(1));
1774    /// assert_eq!(owned.next()?, Some(2));
1775    /// assert_eq!(owned.next()?, Some(3));
1776    /// assert_eq!(owned.next()?, None);
1777    /// # Ok::<(), core::convert::Infallible>(())
1778    /// ```
1779    #[inline(always)]
1780    fn owned(self) -> Owned<Self>
1781    where
1782        Self: Sized,
1783        for<'all> FallibleLend<'all, Self>: ToOwned
1784    {
1785        Owned::new(self)
1786    }
1787
1788    /// The [`FallibleLender`] version of [`Iterator::cycle`].
1789    ///
1790    /// # Examples
1791    ///
1792    /// ```rust
1793    /// # use fallible_iterator::IteratorExt as _;
1794    /// # use lender::prelude::*;
1795    /// let mut cycled = [1, 2].iter().into_lender().into_fallible().cycle();
1796    /// assert_eq!(cycled.next(), Ok(Some(&1)));
1797    /// assert_eq!(cycled.next(), Ok(Some(&2)));
1798    /// assert_eq!(cycled.next(), Ok(Some(&1)));
1799    /// assert_eq!(cycled.next(), Ok(Some(&2)));
1800    /// ```
1801    #[inline(always)]
1802    fn cycle(self) -> Cycle<Self>
1803    where
1804        Self: Sized + Clone,
1805    {
1806        Cycle::new_fallible(self)
1807    }
1808
1809    /// The [`FallibleLender`] version of [`Iterator::sum`].
1810    ///
1811    /// Note: This method requires a type implementing
1812    /// [`SumFallibleLender`]. For simple numeric
1813    /// sums, consider using [`owned()`](FallibleLender::owned)
1814    /// and then [`FallibleIterator::sum()`][fi-sum].
1815    ///
1816    /// [fi-sum]: https://docs.rs/fallible-iterator/latest/fallible_iterator/trait.FallibleIterator.html#method.sum
1817    #[inline(always)]
1818    fn sum<S>(self) -> Result<S, Self::Error>
1819    where
1820        Self: Sized,
1821        S: SumFallibleLender<Self>,
1822    {
1823        S::sum_lender(self)
1824    }
1825
1826    /// The [`FallibleLender`] version of [`Iterator::product`].
1827    ///
1828    /// Note: This method requires a type implementing
1829    /// [`ProductFallibleLender`]. For simple
1830    /// numeric products, consider using
1831    /// [`owned()`](FallibleLender::owned) and then
1832    /// [`FallibleIterator::product()`][fi-prod].
1833    ///
1834    /// [fi-prod]: https://docs.rs/fallible-iterator/latest/fallible_iterator/trait.FallibleIterator.html#method.product
1835    #[inline(always)]
1836    fn product<P>(self) -> Result<P, Self::Error>
1837    where
1838        Self: Sized,
1839        P: ProductFallibleLender<Self>,
1840    {
1841        P::product_lender(self)
1842    }
1843
1844    /// The [`FallibleLender`] version of [`Iterator::cmp`].
1845    ///
1846    /// Note: Due to HRTB limitations, consider using
1847    /// [`cmp_by`](FallibleLender::cmp_by) instead.
1848    ///
1849    /// # Examples
1850    ///
1851    /// ```rust
1852    /// # use fallible_iterator::IteratorExt as _;
1853    /// # use lender::prelude::*;
1854    /// # use core::cmp::Ordering;
1855    /// let a = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1856    ///     [1, 2].iter().into_fallible(),
1857    /// );
1858    /// let b = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1859    ///     [1, 3].iter().into_fallible(),
1860    /// );
1861    /// assert_eq!(a.cmp(b), Ok(Ordering::Less));
1862    /// ```
1863    #[inline(always)]
1864    fn cmp<L>(self, other: L) -> Result<Ordering, Self::Error>
1865    where
1866        L: IntoFallibleLender<Error = Self::Error>,
1867        L::FallibleLender: for<'all> FallibleLending<'all, Lend = FallibleLend<'all, Self>>,
1868        for <'all> FallibleLend<'all, Self>: Ord,
1869        Self: Sized,
1870    {
1871        self.cmp_by(other, |x, y| Ok(x.cmp(&y)))
1872    }
1873
1874    /// The [`FallibleLender`] version of [`Iterator::cmp_by`].
1875    ///
1876    /// Note: the closure receives both lends under a single lifetime
1877    /// (`for<'all>`). This is an HRTB limitation: the two lenders cannot
1878    /// be advanced independently within the closure.
1879    ///
1880    /// # Examples
1881    ///
1882    /// ```rust
1883    /// # use fallible_iterator::IteratorExt as _;
1884    /// # use lender::prelude::*;
1885    /// # use core::cmp::Ordering;
1886    /// let a = [1, 2, 3].into_iter().into_lender().into_fallible();
1887    /// let b = [1, 2, 4].into_iter().into_lender().into_fallible();
1888    /// assert_eq!(
1889    ///     a.cmp_by::<lender::IntoFallible<_>, _>(b, |x: i32, y: i32| Ok(x.cmp(&y))),
1890    ///     Ok(Ordering::Less)
1891    /// );
1892    /// ```
1893    #[inline]
1894    fn cmp_by<L, F>(self, other: L, mut cmp: F) -> Result<Ordering, Self::Error>
1895    where
1896        Self: Sized,
1897        L: IntoFallibleLender<Error = Self::Error>,
1898        F: for<'all> FnMut(FallibleLend<'all, Self>, FallibleLend<'all, L::FallibleLender>) -> Result<Ordering, Self::Error>,
1899    {
1900        match lender_compare(self, other.into_fallible_lender(), move |x, y| match cmp(x, y)? {
1901            Ordering::Equal => Ok(ControlFlow::Continue(())),
1902            neq => Ok(ControlFlow::Break(neq)),
1903        })? {
1904            ControlFlow::Continue(ord) => Ok(ord),
1905            ControlFlow::Break(ord) => Ok(ord),
1906        }
1907    }
1908
1909    /// The [`FallibleLender`] version of [`Iterator::partial_cmp`].
1910    ///
1911    /// Note: Due to HRTB limitations, consider using
1912    /// [`partial_cmp_by`](FallibleLender::partial_cmp_by) instead.
1913    ///
1914    /// # Examples
1915    ///
1916    /// ```rust
1917    /// # use fallible_iterator::IteratorExt as _;
1918    /// # use lender::prelude::*;
1919    /// # use core::cmp::Ordering;
1920    /// let a = [1, 2].into_iter().into_lender().into_fallible();
1921    /// let b = [1, 3].into_iter().into_lender().into_fallible();
1922    /// assert_eq!(
1923    ///     a.partial_cmp::<lender::IntoFallible<_>>(b),
1924    ///     Ok(Some(Ordering::Less))
1925    /// );
1926    /// ```
1927    #[inline(always)]
1928    fn partial_cmp<L>(self, other: L) -> Result<Option<Ordering>, Self::Error>
1929    where
1930        L: IntoFallibleLender<Error = Self::Error>,
1931        for<'all> FallibleLend<'all, Self>: PartialOrd<FallibleLend<'all, L::FallibleLender>>,
1932        Self: Sized,
1933    {
1934        self.partial_cmp_by(other, |x, y| Ok(x.partial_cmp(&y)))
1935    }
1936
1937    /// The [`FallibleLender`] version of [`Iterator::partial_cmp_by`].
1938    ///
1939    /// See [`cmp_by`](FallibleLender::cmp_by) for a note on the unified
1940    /// lifetime constraint.
1941    ///
1942    /// # Examples
1943    ///
1944    /// ```rust
1945    /// # use fallible_iterator::IteratorExt as _;
1946    /// # use lender::prelude::*;
1947    /// # use core::cmp::Ordering;
1948    /// let a = [1, 2].into_iter().into_lender().into_fallible();
1949    /// let b = [1, 3].into_iter().into_lender().into_fallible();
1950    /// assert_eq!(
1951    ///     a.partial_cmp_by::<lender::IntoFallible<_>, _>(
1952    ///         b,
1953    ///         |x: i32, y: i32| Ok(x.partial_cmp(&y))
1954    ///     ),
1955    ///     Ok(Some(Ordering::Less))
1956    /// );
1957    /// ```
1958    #[inline]
1959    fn partial_cmp_by<L, F>(self, other: L, mut partial_cmp: F) -> Result<Option<Ordering>, Self::Error>
1960    where
1961        Self: Sized,
1962        L: IntoFallibleLender<Error = Self::Error>,
1963        F: for<'all> FnMut(FallibleLend<'all, Self>, FallibleLend<'all, L::FallibleLender>) -> Result<Option<Ordering>, Self::Error>,
1964    {
1965        match lender_compare(self, other.into_fallible_lender(), move |x, y| match partial_cmp(x, y)? {
1966            Some(Ordering::Equal) => Ok(ControlFlow::Continue(())),
1967            neq => Ok(ControlFlow::Break(neq)),
1968        })? {
1969            ControlFlow::Continue(ord) => Ok(Some(ord)),
1970            ControlFlow::Break(ord) => Ok(ord),
1971        }
1972    }
1973
1974    /// The [`FallibleLender`] version of [`Iterator::eq`].
1975    ///
1976    /// Note: Due to HRTB limitations, consider using
1977    /// [`eq_by`](FallibleLender::eq_by) instead.
1978    #[inline(always)]
1979    fn eq<L>(self, other: L) -> Result<bool, Self::Error>
1980    where
1981        L: IntoFallibleLender<Error = Self::Error>,
1982        for<'all> FallibleLend<'all, Self>: PartialEq<FallibleLend<'all, L::FallibleLender>>,
1983        Self: Sized,
1984    {
1985        self.eq_by(other, |x, y| Ok(x == y))
1986    }
1987
1988    /// The [`FallibleLender`] version of [`Iterator::eq_by`].
1989    ///
1990    /// See [`cmp_by`](FallibleLender::cmp_by) for a note on the unified
1991    /// lifetime constraint.
1992    ///
1993    /// # Examples
1994    ///
1995    /// ```rust
1996    /// # use fallible_iterator::IteratorExt as _;
1997    /// # use lender::prelude::*;
1998    /// let a = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
1999    ///     [1, 2].iter().into_fallible(),
2000    /// );
2001    /// let b = lender::lend_fallible_iter::<fallible_lend!(&'lend i32), _>(
2002    ///     [1, 2].iter().into_fallible(),
2003    /// );
2004    /// assert_eq!(a.eq_by(b, |x, y| Ok(x == y)), Ok(true));
2005    /// ```
2006    #[inline]
2007    fn eq_by<L, F>(self, other: L, mut eq: F) -> Result<bool, Self::Error>
2008    where
2009        Self: Sized,
2010        L: IntoFallibleLender<Error = Self::Error>,
2011        F: for<'all> FnMut(FallibleLend<'all, Self>, FallibleLend<'all, L::FallibleLender>) -> Result<bool, Self::Error>,
2012    {
2013        match lender_compare(self, other.into_fallible_lender(), move |x, y| Ok(
2014            if eq(x, y)? { ControlFlow::Continue(()) } else { ControlFlow::Break(()) }
2015        ))? {
2016            ControlFlow::Continue(ord) => Ok(ord == Ordering::Equal),
2017            ControlFlow::Break(()) => Ok(false),
2018        }
2019    }
2020
2021    /// The [`FallibleLender`] version of [`Iterator::ne`].
2022    ///
2023    /// Note: Due to HRTB limitations, consider using
2024    /// [`eq_by`](FallibleLender::eq_by) instead.
2025    ///
2026    /// # Examples
2027    ///
2028    /// ```rust
2029    /// # use fallible_iterator::IteratorExt as _;
2030    /// # use lender::prelude::*;
2031    /// let a = [1, 2].into_iter().into_lender().into_fallible();
2032    /// let b = [1, 3].into_iter().into_lender().into_fallible();
2033    /// assert_eq!(a.ne::<lender::IntoFallible<_>>(b), Ok(true));
2034    /// ```
2035    #[inline(always)]
2036    fn ne<L>(self, other: L) -> Result<bool, Self::Error>
2037    where
2038        L: IntoFallibleLender<Error = Self::Error>,
2039        for<'all> FallibleLend<'all, Self>: PartialEq<FallibleLend<'all, L::FallibleLender>>,
2040        Self: Sized,
2041    {
2042        self.eq(other).map(|eq| !eq)
2043    }
2044
2045    /// The [`FallibleLender`] version of [`Iterator::lt`].
2046    ///
2047    /// Note: Due to HRTB limitations, consider using
2048    /// [`partial_cmp_by`](FallibleLender::partial_cmp_by) instead.
2049    ///
2050    /// # Examples
2051    ///
2052    /// ```rust
2053    /// # use fallible_iterator::IteratorExt as _;
2054    /// # use lender::prelude::*;
2055    /// let a = [1, 2].into_iter().into_lender().into_fallible();
2056    /// let b = [1, 3].into_iter().into_lender().into_fallible();
2057    /// assert_eq!(a.lt::<lender::IntoFallible<_>>(b), Ok(true));
2058    /// ```
2059    #[inline(always)]
2060    fn lt<L>(self, other: L) -> Result<bool, Self::Error>
2061    where
2062        L: IntoFallibleLender<Error = Self::Error>,
2063        for<'all> FallibleLend<'all, Self>: PartialOrd<FallibleLend<'all, L::FallibleLender>>,
2064        Self: Sized,
2065    {
2066        Ok(self.partial_cmp(other)? == Some(Ordering::Less))
2067    }
2068
2069    /// The [`FallibleLender`] version of [`Iterator::le`].
2070    ///
2071    /// Note: Due to HRTB limitations, consider using
2072    /// [`partial_cmp_by`](FallibleLender::partial_cmp_by) instead.
2073    ///
2074    /// # Examples
2075    ///
2076    /// ```rust
2077    /// # use fallible_iterator::IteratorExt as _;
2078    /// # use lender::prelude::*;
2079    /// let a = [1, 2].into_iter().into_lender().into_fallible();
2080    /// let b = [1, 2].into_iter().into_lender().into_fallible();
2081    /// assert_eq!(a.le::<lender::IntoFallible<_>>(b), Ok(true));
2082    /// ```
2083    #[inline(always)]
2084    fn le<L>(self, other: L) -> Result<bool, Self::Error>
2085    where
2086        L: IntoFallibleLender<Error = Self::Error>,
2087        for<'all> FallibleLend<'all, Self>: PartialOrd<FallibleLend<'all, L::FallibleLender>>,
2088        Self: Sized,
2089    {
2090        Ok(matches!(self.partial_cmp(other)?, Some(Ordering::Less | Ordering::Equal)))
2091    }
2092
2093    /// The [`FallibleLender`] version of [`Iterator::gt`].
2094    ///
2095    /// Note: Due to HRTB limitations, consider using
2096    /// [`partial_cmp_by`](FallibleLender::partial_cmp_by) instead.
2097    ///
2098    /// # Examples
2099    ///
2100    /// ```rust
2101    /// # use fallible_iterator::IteratorExt as _;
2102    /// # use lender::prelude::*;
2103    /// let a = [1, 3].into_iter().into_lender().into_fallible();
2104    /// let b = [1, 2].into_iter().into_lender().into_fallible();
2105    /// assert_eq!(a.gt::<lender::IntoFallible<_>>(b), Ok(true));
2106    /// ```
2107    #[inline(always)]
2108    fn gt<L>(self, other: L) -> Result<bool, Self::Error>
2109    where
2110        L: IntoFallibleLender<Error = Self::Error>,
2111        for<'all> FallibleLend<'all, Self>: PartialOrd<FallibleLend<'all, L::FallibleLender>>,
2112        Self: Sized,
2113    {
2114        Ok(self.partial_cmp(other)? == Some(Ordering::Greater))
2115    }
2116
2117    /// The [`FallibleLender`] version of [`Iterator::ge`].
2118    ///
2119    /// Note: Due to HRTB limitations, consider using
2120    /// [`partial_cmp_by`](FallibleLender::partial_cmp_by) instead.
2121    ///
2122    /// # Examples
2123    ///
2124    /// ```rust
2125    /// # use fallible_iterator::IteratorExt as _;
2126    /// # use lender::prelude::*;
2127    /// let a = [1, 2].into_iter().into_lender().into_fallible();
2128    /// let b = [1, 2].into_iter().into_lender().into_fallible();
2129    /// assert_eq!(a.ge::<lender::IntoFallible<_>>(b), Ok(true));
2130    /// ```
2131    #[inline(always)]
2132    fn ge<L>(self, other: L) -> Result<bool, Self::Error>
2133    where
2134        L: IntoFallibleLender<Error = Self::Error>,
2135        for<'all> FallibleLend<'all, Self>: PartialOrd<FallibleLend<'all, L::FallibleLender>>,
2136        Self: Sized,
2137    {
2138        Ok(matches!(self.partial_cmp(other)?, Some(Ordering::Greater | Ordering::Equal)))
2139    }
2140
2141    /// The [`FallibleLender`] version of [`Iterator::is_sorted`].
2142    ///
2143    /// # Examples
2144    ///
2145    /// ```rust
2146    /// # use lender::prelude::*;
2147    /// let lender = [1, 2, 3].into_iter().into_lender().into_fallible();
2148    /// assert_eq!(lender.is_sorted(), Ok(true));
2149    ///
2150    /// let lender = [1, 3, 2].into_iter().into_lender().into_fallible();
2151    /// assert_eq!(lender.is_sorted(), Ok(false));
2152    /// ```
2153    #[inline(always)]
2154    #[allow(clippy::wrong_self_convention)]
2155    fn is_sorted<T>(self) -> Result<bool, Self::Error>
2156    where
2157        Self: Sized,
2158        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
2159        T: PartialOrd,
2160    {
2161        self.is_sorted_by(|x, y| Ok(PartialOrd::partial_cmp(x, y)))
2162    }
2163
2164    /// The [`FallibleLender`] version of [`Iterator::is_sorted_by`].
2165    ///
2166    /// # Examples
2167    ///
2168    /// ```rust
2169    /// # use lender::prelude::*;
2170    /// // Sorted in descending order.
2171    /// let lender = [3, 2, 1].into_iter().into_lender().into_fallible();
2172    /// assert_eq!(
2173    ///     lender.is_sorted_by(|a, b| Ok(b.partial_cmp(a))),
2174    ///     Ok(true)
2175    /// );
2176    /// ```
2177    #[inline]
2178    #[allow(clippy::wrong_self_convention)]
2179    fn is_sorted_by<T, F>(self, mut compare: F) -> Result<bool, Self::Error>
2180    where
2181        Self: Sized,
2182        for<'all> FallibleLend<'all, Self>: ToOwned<Owned = T>,
2183        F: FnMut(&T, &T) -> Result<Option<Ordering>, Self::Error>,
2184    {
2185        use fallible_iterator::FallibleIterator;
2186        let mut this = self.owned();
2187        let Some(mut last) = this.next()? else {
2188            return Ok(true);
2189        };
2190        this.all(move |curr| {
2191            if let Some(Ordering::Greater) | None = compare(&last, &curr)? {
2192                return Ok(false);
2193            }
2194            last = curr;
2195            Ok(true)
2196        })
2197    }
2198
2199    /// The [`FallibleLender`] version of [`Iterator::is_sorted_by_key`].
2200    ///
2201    /// # Examples
2202    ///
2203    /// ```rust
2204    /// # use lender::prelude::*;
2205    /// let lender =
2206    ///     ["a", "bbb", "cc"].into_iter().into_lender().into_fallible();
2207    /// assert_eq!(
2208    ///     lender.is_sorted_by_key(|s| Ok(s.len())),
2209    ///     Ok(false)
2210    /// );
2211    ///
2212    /// let lender =
2213    ///     ["a", "cc", "bbb"].into_iter().into_lender().into_fallible();
2214    /// assert_eq!(
2215    ///     lender.is_sorted_by_key(|s| Ok(s.len())),
2216    ///     Ok(true)
2217    /// );
2218    /// ```
2219    #[inline]
2220    #[allow(clippy::wrong_self_convention)]
2221    fn is_sorted_by_key<F, K>(mut self, mut f: F) -> Result<bool, Self::Error>
2222    where
2223        Self: Sized,
2224        F: FnMut(FallibleLend<'_, Self>) -> Result<K, Self::Error>,
2225        K: PartialOrd,
2226    {
2227        let mut last = match self.next()? {
2228            None => return Ok(true),
2229            Some(x) => f(x)?,
2230        };
2231        while let Some(x) = self.next()? {
2232            let curr = f(x)?;
2233            if let Some(Ordering::Greater) | None = last.partial_cmp(&curr) {
2234                return Ok(false);
2235            }
2236            last = curr;
2237        }
2238        Ok(true)
2239    }
2240
2241    /// A lending replacement for [`Iterator::array_chunks`].
2242    ///
2243    /// This method returns a lender that yields lenders returning the next
2244    /// `chunk_size` lends.
2245    ///
2246    /// # Panics
2247    ///
2248    /// Panics if `chunk_size` is zero.
2249    ///
2250    /// # Examples
2251    ///
2252    /// ```rust
2253    /// # use lender::prelude::*;
2254    /// let data = [1, 2, 3, 4, 5];
2255    /// let lender = data.iter().into_lender().into_fallible();
2256    /// let mut chunky = lender.chunky(2);
2257    /// let mut chunk1 = chunky.next().unwrap().unwrap();
2258    /// assert_eq!(chunk1.next().unwrap(), Some(&1));
2259    /// assert_eq!(chunk1.next().unwrap(), Some(&2));
2260    /// assert_eq!(chunk1.next().unwrap(), None);
2261    /// let mut chunk2 = chunky.next().unwrap().unwrap();
2262    /// assert_eq!(chunk2.next().unwrap(), Some(&3));
2263    /// assert_eq!(chunk2.next().unwrap(), Some(&4));
2264    /// assert_eq!(chunk2.next().unwrap(), None);
2265    /// let mut chunk3 = chunky.next().unwrap().unwrap();
2266    /// assert_eq!(chunk3.next().unwrap(), Some(&5));
2267    /// assert_eq!(chunk3.next().unwrap(), None);
2268    /// ```
2269    #[inline(always)]
2270    fn chunky(self, chunk_size: usize) -> Chunky<Self>
2271    where
2272        Self: Sized + ExactSizeFallibleLender,
2273    {
2274        Chunky::new_fallible(self, chunk_size)
2275    }
2276
2277    /// Turns this [`FallibleLender`] into a
2278    /// [`FallibleIterator`](fallible_iterator::FallibleIterator) where it has
2279    /// already fulfilled the requirements of the
2280    /// [`FallibleIterator`](fallible_iterator::FallibleIterator) trait.
2281    ///
2282    /// Note: Due to HRTB limitations, consider using
2283    /// [`copied`](FallibleLender::copied), [`cloned`](FallibleLender::cloned),
2284    /// or [`owned`](FallibleLender::owned) instead when applicable.
2285    ///
2286    /// # Examples
2287    ///
2288    /// ```rust
2289    /// # use lender::prelude::*;
2290    /// # use fallible_iterator::FallibleIterator;
2291    /// let lender =
2292    ///     [1, 2, 3].into_iter().into_lender().into_fallible();
2293    /// let v: Vec<i32> = lender.iter().collect().unwrap();
2294    /// assert_eq!(v, vec![1, 2, 3]);
2295    /// ```
2296    #[inline(always)]
2297    fn iter<'this>(self) -> Iter<'this, Self>
2298    where
2299        Self: Sized + 'this,
2300        for<'all> FallibleLend<'all, Self>: 'this,
2301    {
2302        Iter::new(self)
2303    }
2304
2305    /// Turns this [`FallibleLender`] into a new
2306    /// [`FallibleLender`] that lends references to the items
2307    /// of the original lender.
2308    ///
2309    /// This is a convenience for `self.iter().into_fallible_ref_lender()`:
2310    /// first, [`iter`](FallibleLender::iter) converts this lender into a
2311    /// [`FallibleIterator`](fallible_iterator::FallibleIterator); then,
2312    /// [`into_fallible_ref_lender`](crate::traits::FallibleIteratorRefExt::into_fallible_ref_lender)
2313    /// wraps it back into a [`FallibleLender`] that stores each element and
2314    /// lends a reference to it.
2315    ///
2316    /// The resulting lender has
2317    /// `FallibleLend<'lend> = &'lend FallibleLend<'this, Self>`.
2318    ///
2319    /// # Examples
2320    ///
2321    /// ```rust
2322    /// # use lender::prelude::*;
2323    /// let mut lender =
2324    ///     [1, 2, 3].into_iter().into_lender()
2325    ///         .into_fallible().lender_by_ref();
2326    /// let item: &i32 =
2327    ///     lender.next().unwrap().unwrap();
2328    /// assert_eq!(*item, 1);
2329    /// ```
2330    #[inline(always)]
2331    fn lender_by_ref<'this>(
2332        self,
2333    ) -> FromFallibleIterRef<Iter<'this, Self>>
2334    where
2335        Self: Sized + 'this,
2336        for<'all> FallibleLend<'all, Self>: 'this,
2337    {
2338        crate::from_fallible_iter_ref(self.iter())
2339    }
2340}
2341
2342#[inline]
2343pub(crate) fn lender_compare<A, B, F, T>(
2344    mut a: A,
2345    mut b: B,
2346    mut f: F,
2347) -> Result<ControlFlow<T, Ordering>, A::Error>
2348where
2349    A: FallibleLender,
2350    B: FallibleLender<Error = A::Error>,
2351    for<'all> F:
2352        FnMut(FallibleLend<'all, A>, FallibleLend<'all, B>) -> Result<ControlFlow<T>, A::Error>,
2353{
2354    let mut ctl = ControlFlow::Continue(());
2355    while let Some(x) = a.next()? {
2356        match b.next()? {
2357            None => {
2358                ctl = ControlFlow::Break(ControlFlow::Continue(Ordering::Greater));
2359                break;
2360            }
2361            Some(y) => {
2362                if let ControlFlow::Break(x) = f(x, y)? {
2363                    ctl = ControlFlow::Break(ControlFlow::Break(x));
2364                    break;
2365                }
2366            }
2367        }
2368    }
2369    match ctl {
2370        ControlFlow::Continue(()) => Ok(ControlFlow::Continue(match b.next()? {
2371            None => Ordering::Equal,
2372            Some(_) => Ordering::Less,
2373        })),
2374        ControlFlow::Break(x) => Ok(x),
2375    }
2376}
2377
2378impl<'lend, L: FallibleLender> FallibleLending<'lend> for &mut L {
2379    type Lend = FallibleLend<'lend, L>;
2380}
2381
2382impl<L: FallibleLender> FallibleLender for &mut L {
2383    type Error = L::Error;
2384    // SAFETY: the lend is that of L
2385    crate::unsafe_assume_covariance_fallible!();
2386    #[inline(always)]
2387    fn next(&mut self) -> Result<Option<FallibleLend<'_, Self>>, Self::Error> {
2388        (**self).next()
2389    }
2390
2391    #[inline(always)]
2392    fn size_hint(&self) -> (usize, Option<usize>) {
2393        (**self).size_hint()
2394    }
2395
2396    #[inline(always)]
2397    fn advance_by(&mut self, n: usize) -> Result<Result<(), NonZeroUsize>, Self::Error> {
2398        (**self).advance_by(n)
2399    }
2400}