1use core::{fmt, marker};
2
3use crate::{DoubleEndedLender, ExactSizeLender, FusedLender, Lend, Lender, Lending};
4
5pub const fn empty<L: ?Sized + for<'all> Lending<'all>>() -> Empty<L> {
17 Empty(marker::PhantomData)
18}
19
20#[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}