Skip to main content

lender/traits/
collect.rs

1use crate::{FallibleLend, FallibleLender, Lend, Lender};
2
3/// A trait for creating a value from a [`Lender`].
4///
5/// # Examples
6/// ```
7/// # use lender::prelude::*;
8/// struct MyStruct;
9/// impl<L: IntoLender> FromLender<L> for MyStruct
10/// where
11///     L::Lender: for<'all> Lending<'all, Lend = &'all mut [i32]>,
12/// {
13///     fn from_lender(lender: L) -> Self {
14///         lender.into_lender().for_each(|lend| drop(lend));
15///         Self
16///     }
17/// }
18/// ```
19pub trait FromLender<L: IntoLender>: Sized {
20    /// Creates a value from a [`Lender`].
21    fn from_lender(lender: L) -> Self;
22}
23
24/// A trait for creating a value from a [`FallibleLender`].
25///
26/// This is the fallible counterpart to [`FromLender`].
27///
28/// # Examples
29/// ```
30/// # use lender::prelude::*;
31/// # use std::convert::Infallible;
32/// struct MyVec(Vec<i32>);
33///
34/// impl<L: IntoFallibleLender<Error = Infallible>> FromFallibleLender<L> for MyVec
35/// where
36///     L::FallibleLender: for<'all> FallibleLending<'all, Lend = i32>,
37/// {
38///     fn from_fallible_lender(lender: L) -> Result<Self, Infallible> {
39///         let mut vec = Vec::new();
40///         lender.into_fallible_lender().for_each(|x| {
41///             vec.push(x);
42///             Ok(())
43///         })?;
44///         Ok(MyVec(vec))
45///     }
46/// }
47/// ```
48pub trait FromFallibleLender<L: IntoFallibleLender>: Sized {
49    /// Creates a value from a [`FallibleLender`],
50    /// returning an error if the lender produces one.
51    fn from_fallible_lender(lender: L) -> Result<Self, L::Error>;
52}
53
54/// Conversion into a [`Lender`].
55///
56/// This is the [`Lender`] version of [`core::iter::IntoIterator`].
57///
58/// Every [`Lender`] implements `IntoLender` for itself (returning `self`).
59pub trait IntoLender {
60    /// The lender type that this type converts into.
61    type Lender: Lender;
62    /// Converts this type into a [`Lender`].
63    fn into_lender(self) -> <Self as IntoLender>::Lender;
64}
65
66impl<L: Lender> IntoLender for L {
67    type Lender = L;
68    #[inline]
69    fn into_lender(self) -> L {
70        self
71    }
72}
73
74/// The [`Lender`] version of [`core::iter::Extend`].
75pub trait ExtendLender<L: IntoLender> {
76    /// Extends a collection with the contents of a lender.
77    fn extend_lender(&mut self, lender: L);
78    /// Extends a collection with exactly one element.
79    fn extend_lender_one(&mut self, item: Lend<'_, L::Lender>);
80    /// Reserves capacity in a collection for the given number
81    /// of additional elements.
82    ///
83    /// The default implementation does nothing.
84    #[inline]
85    fn extend_lender_reserve(&mut self, additional: usize) {
86        let _ = additional;
87    }
88}
89
90/// The [`FallibleLender`] version of [`core::iter::Extend`].
91///
92/// This is the fallible counterpart to [`ExtendLender`].
93pub trait ExtendFallibleLender<L: IntoFallibleLender> {
94    /// Extends a collection with elements from a fallible lender.
95    ///
96    /// Returns an error if the lender produces an error during iteration.
97    fn extend_fallible_lender(&mut self, lender: L) -> Result<(), L::Error>;
98
99    /// Extends a collection with exactly one element.
100    fn extend_fallible_lender_one(&mut self, item: FallibleLend<'_, L::FallibleLender>);
101
102    /// Reserves capacity in a collection for the given number
103    /// of additional elements.
104    ///
105    /// The default implementation does nothing.
106    #[inline]
107    fn extend_fallible_lender_reserve(&mut self, additional: usize) {
108        let _ = additional;
109    }
110}
111
112/// Conversion into a [`FallibleLender`].
113///
114/// This is the [`FallibleLender`] version of [`core::iter::IntoIterator`].
115///
116/// By implementing `IntoFallibleLender` for a type, you define how it will be
117/// converted to a fallible lender.
118///
119/// Every [`FallibleLender`] implements `IntoFallibleLender` for itself
120/// (returning `self`).
121pub trait IntoFallibleLender {
122    /// The error type of the resulting fallible lender.
123    type Error;
124    /// The fallible lender type that this type converts into.
125    type FallibleLender: FallibleLender<Error = Self::Error>;
126    /// Converts this type into a [`FallibleLender`].
127    fn into_fallible_lender(self) -> Self::FallibleLender;
128}
129
130impl<L: FallibleLender> IntoFallibleLender for L {
131    type Error = L::Error;
132    type FallibleLender = L;
133    #[inline]
134    fn into_fallible_lender(self) -> L {
135        self
136    }
137}