orx_iterable/sources/
once.rs

1use crate::{Collection, CollectionMut, Iterable};
2
3/// An iterable which yields a wrapped value only once.
4pub struct Once<T>
5where
6    T: Clone,
7{
8    pub(crate) value: T,
9}
10
11impl<T> Iterable for Once<T>
12where
13    T: Clone,
14{
15    type Item = T;
16
17    type Iter = core::iter::Once<T>;
18
19    fn iter(&self) -> Self::Iter {
20        core::iter::once(self.value.clone())
21    }
22}
23
24impl<T> Iterable for core::iter::Once<T>
25where
26    T: Clone,
27{
28    type Item = T;
29
30    type Iter = core::iter::Once<T>;
31
32    fn iter(&self) -> Self::Iter {
33        self.clone()
34    }
35}
36
37// col
38
39/// An iterable collection having only one item.
40pub struct OnceCol<T> {
41    pub(crate) value: T,
42}
43
44impl<'a, T> Iterable for &'a OnceCol<T> {
45    type Item = &'a T;
46
47    type Iter = core::iter::Once<Self::Item>;
48
49    fn iter(&self) -> Self::Iter {
50        core::iter::once(&self.value)
51    }
52}
53
54impl<T> Collection for OnceCol<T> {
55    type Item = T;
56
57    type Iterable<'i>
58        = &'i Self
59    where
60        Self: 'i;
61
62    fn as_iterable(&self) -> Self::Iterable<'_> {
63        self
64    }
65}
66
67impl<T> CollectionMut for OnceCol<T> {
68    type IterMut<'i>
69        = core::iter::Once<&'i mut T>
70    where
71        Self: 'i;
72
73    fn iter_mut(&mut self) -> Self::IterMut<'_> {
74        core::iter::once(&mut self.value)
75    }
76}
77
78/// Creates an iterable which yields only one `value`.
79pub fn once<T>(value: T) -> Once<T>
80where
81    T: Clone,
82{
83    Once { value }
84}
85
86/// Creates an iterable collection having only one element with the given `value`.
87pub fn once_col<T>(value: T) -> OnceCol<T> {
88    OnceCol { value }
89}