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}