lender/sources/
empty.rs

1use core::{fmt, marker};
2
3use crate::{DoubleEndedLender, ExactSizeLender, FusedLender, Lend, Lender, Lending};
4
5/// Creates a lender that yields nothing.
6///
7/// similar to [`core::iter::empty()`]
8///
9/// # Examples
10/// ```rust
11/// use lender::prelude::*;
12/// let mut e = lender::empty::<lend!(&'lend mut u32)>();
13/// let x: Option<&'_ mut u32> = e.next();
14/// assert_eq!(x, None);
15/// ```
16pub const fn empty<L: ?Sized + for<'all> Lending<'all>>() -> Empty<L> {
17    Empty(marker::PhantomData)
18}
19
20/// A lender that yields nothing.
21///
22/// This `struct` is created by the [`empty()`] function.
23///
24/// similar to [`core::iter::Empty`].
25#[must_use = "lenders are lazy and do nothing unless consumed"]
26pub struct Empty<L: ?Sized>(marker::PhantomData<L>);
27
28impl<L: ?Sized> fmt::Debug for Empty<L> {
29    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30        f.debug_struct("Empty").finish()
31    }
32}
33
34impl<'lend, L> Lending<'lend> for Empty<L>
35where
36    L: ?Sized + for<'all> Lending<'all>,
37{
38    type Lend = Lend<'lend, L>;
39}
40impl<L> Lender for Empty<L>
41where
42    L: ?Sized + for<'all> Lending<'all>,
43{
44    fn next(&mut self) -> Option<Lend<'_, Self>> {
45        None
46    }
47    fn size_hint(&self) -> (usize, Option<usize>) {
48        (0, Some(0))
49    }
50}
51
52impl<L> DoubleEndedLender for Empty<L>
53where
54    L: ?Sized + for<'all> Lending<'all>,
55{
56    fn next_back(&mut self) -> Option<Lend<'_, Self>> {
57        None
58    }
59}
60
61impl<L> ExactSizeLender for Empty<L>
62where
63    L: ?Sized + for<'all> Lending<'all>,
64{
65    fn len(&self) -> usize {
66        0
67    }
68}
69
70impl<L> FusedLender for Empty<L> where L: ?Sized + for<'all> Lending<'all> {}
71
72impl<L: ?Sized> Clone for Empty<L> {
73    fn clone(&self) -> Empty<L> {
74        Empty(marker::PhantomData)
75    }
76}
77
78impl<L: ?Sized> Default for Empty<L> {
79    fn default() -> Empty<L> {
80        Empty(marker::PhantomData)
81    }
82}