Skip to main content

lender/traits/
ext.rs

1use fallible_iterator::{FallibleIterator, IntoFallibleIterator};
2
3use crate::{
4    FromFallibleIter, FromFallibleIterRef, FromIntoFallibleIter, FromIntoIter, FromIter,
5    FromIterRef,
6};
7
8/// Extension trait adding to [`Iterator`] the method
9/// [`into_lender`](IteratorExt::into_lender), which turns an [`Iterator`]
10/// into a [`Lender`](crate::Lender) without allocation.
11pub trait IteratorExt<I: Iterator> {
12    /// Turn this [`Iterator`] into a [`Lender`](crate::Lender) without
13    /// allocation.
14    ///
15    /// This method is a convenient entry point for
16    /// [`from_iter`](crate::from_iter).
17    fn into_lender(self) -> FromIter<I>;
18}
19
20impl<I: Iterator> IteratorExt<I> for I {
21    #[inline(always)]
22    fn into_lender(self) -> FromIter<I> {
23        crate::from_iter(self)
24    }
25}
26
27/// Extension trait adding to [`IntoIterator`] the method
28/// [`into_into_lender`](IntoIteratorExt::into_into_lender), which turns an
29/// [`IntoIterator`] into an [`IntoLender`](crate::IntoLender) without
30/// allocation.
31pub trait IntoIteratorExt<I: IntoIterator> {
32    /// Turn this [`IntoIterator`] into an [`IntoLender`](crate::IntoLender)
33    /// without allocation.
34    ///
35    /// This method is a convenient entry point for
36    /// [`from_into_iter`](crate::from_into_iter).
37    fn into_into_lender(self) -> FromIntoIter<I>;
38}
39
40impl<I: IntoIterator> IntoIteratorExt<I> for I {
41    #[inline(always)]
42    fn into_into_lender(self) -> FromIntoIter<I> {
43        crate::from_into_iter(self)
44    }
45}
46
47/// Extension trait adding to [`FallibleIterator`] the method
48/// [`into_fallible_lender`](FallibleIteratorExt::into_fallible_lender), which
49/// turns a [`FallibleIterator`] into a
50/// [`FallibleLender`](crate::FallibleLender) without allocation.
51pub trait FallibleIteratorExt<I: FallibleIterator> {
52    /// Turn this [`FallibleIterator`] into a
53    /// [`FallibleLender`](crate::FallibleLender) without allocation.
54    ///
55    /// This method is a convenient entry point for
56    /// [`from_fallible_iter`](crate::from_fallible_iter).
57    fn into_fallible_lender(self) -> FromFallibleIter<I>;
58}
59
60impl<I: FallibleIterator> FallibleIteratorExt<I> for I {
61    #[inline(always)]
62    fn into_fallible_lender(self) -> FromFallibleIter<I> {
63        crate::from_fallible_iter(self)
64    }
65}
66
67/// Extension trait adding to [`IntoFallibleIterator`] the method
68/// [`into_into_fallible_lender`][1], which turns an
69/// [`IntoFallibleIterator`] into an [`IntoFallibleLender`] without
70/// allocation.
71///
72/// [1]: IntoFallibleIteratorExt::into_into_fallible_lender
73/// [`IntoFallibleLender`]: crate::IntoFallibleLender
74pub trait IntoFallibleIteratorExt<I: IntoFallibleIterator> {
75    /// Turn this [`IntoFallibleIterator`] into an
76    /// [`IntoFallibleLender`](crate::IntoFallibleLender) without allocation.
77    ///
78    /// This method is a convenient entry point for
79    /// [`from_into_fallible_iter`](crate::from_into_fallible_iter).
80    fn into_into_fallible_lender(self) -> FromIntoFallibleIter<I>;
81}
82
83impl<I: IntoFallibleIterator> IntoFallibleIteratorExt<I> for I {
84    #[inline(always)]
85    fn into_into_fallible_lender(self) -> FromIntoFallibleIter<I> {
86        crate::from_into_fallible_iter(self)
87    }
88}
89
90/// Extension trait adding to [`Iterator`] the method
91/// [`into_ref_lender`](IteratorRefExt::into_ref_lender),
92/// which turns an `Iterator<Item = T>` into a
93/// [`Lender`](crate::Lender) with `Lend<'lend> = &'lend T`.
94pub trait IteratorRefExt<I: Iterator> {
95    /// Turn this [`Iterator`] into a [`Lender`](crate::Lender)
96    /// that stores each element and lends a reference to it.
97    ///
98    /// This method is a convenient entry point for
99    /// [`from_iter_ref`](crate::from_iter_ref).
100    fn into_ref_lender(self) -> FromIterRef<I>;
101}
102
103impl<I: Iterator> IteratorRefExt<I> for I {
104    #[inline(always)]
105    fn into_ref_lender(self) -> FromIterRef<I> {
106        crate::from_iter_ref(self)
107    }
108}
109
110/// Extension trait adding to [`FallibleIterator`] the method
111/// [`into_fallible_ref_lender`](FallibleIteratorRefExt::into_fallible_ref_lender),
112/// which turns a `FallibleIterator<Item = T>` into a
113/// [`FallibleLender`](crate::FallibleLender) with `FallibleLend<'lend> = &'lend
114/// T`.
115pub trait FallibleIteratorRefExt<I: FallibleIterator> {
116    /// Turn this [`FallibleIterator`] into a
117    /// [`FallibleLender`](crate::FallibleLender) that stores
118    /// each element and lends a reference to it.
119    ///
120    /// This method is a convenient entry point for
121    /// [`from_fallible_iter_ref`](crate::from_fallible_iter_ref).
122    fn into_fallible_ref_lender(self) -> FromFallibleIterRef<I>;
123}
124
125impl<I: FallibleIterator> FallibleIteratorRefExt<I> for I {
126    #[inline(always)]
127    fn into_fallible_ref_lender(self) -> FromFallibleIterRef<I> {
128        crate::from_fallible_iter_ref(self)
129    }
130}