Skip to main content

hexga_core/
iter.rs

1pub use core::iter::{Product, Sum};
2use super::*;
3
4#[cfg(feature = "std")]
5use std::error::Error;
6#[cfg(feature = "std")]
7use core::any::Any;
8
9/// A trait to create a value from an iterator.
10pub trait TryFromIterator<T> : Sized
11{
12    type Error;
13    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error>;
14}
15impl<T> TryFromIterator<T> for Vec<T> {
16    type Error = Never;
17    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error> {
18        Ok(Self::from_iter(iter))
19    }
20}
21
22impl<T> TryFromIterator<T> for VecDeque<T> {
23    type Error = Never;
24    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error> {
25        Ok(Self::from_iter(iter))
26    }
27}
28
29impl<T> TryFromIterator<T> for LinkedList<T> {
30    type Error = Never;
31    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error> {
32        Ok(Self::from_iter(iter))
33    }
34}
35
36impl<T: Ord> TryFromIterator<T> for BinaryHeap<T> {
37    type Error = Never;
38    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error> {
39        Ok(Self::from_iter(iter))
40    }
41}
42
43#[cfg(feature = "std")]
44impl<T: Eq + Hash, S: BuildHasher + Default> TryFromIterator<T> for HashSet<T, S> {
45    type Error = Never; // HashSet::from_iter never fails
46    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error> {
47        Ok(Self::from_iter(iter))
48    }
49}
50
51impl<T: Ord> TryFromIterator<T> for BTreeSet<T> {
52    type Error = Never;
53    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error> {
54        Ok(Self::from_iter(iter))
55    }
56}
57
58#[cfg(feature = "std")]
59impl<K: Eq + Hash, V, S: BuildHasher + Default> TryFromIterator<(K, V)> for HashMap<K, V, S> {
60    type Error = Never;
61    fn try_from_iter<It: IntoIterator<Item = (K, V)>>(iter: It) -> Result<Self, Self::Error> {
62        Ok(Self::from_iter(iter))
63    }
64}
65
66impl<K: Ord, V> TryFromIterator<(K, V)> for BTreeMap<K, V> {
67    type Error = Never;
68    fn try_from_iter<It: IntoIterator<Item = (K, V)>>(iter: It) -> Result<Self, Self::Error> {
69        Ok(Self::from_iter(iter))
70    }
71}
72
73impl TryFromIterator<char> for String {
74    type Error = Never;
75    fn try_from_iter<It: IntoIterator<Item = char>>(iter: It) -> Result<Self, Self::Error> {
76        Ok(Self::from_iter(iter))
77    }
78}
79
80impl<'a> TryFromIterator<&'a str> for String {
81    type Error = Never;
82    fn try_from_iter<It: IntoIterator<Item = &'a str>>(iter: It) -> Result<Self, Self::Error> {
83        Ok(Self::from_iter(iter))
84    }
85}
86
87
88
89
90#[repr(transparent)]
91#[derive(Clone, Copy, Eq, Ord, PartialEq, PartialOrd, Hash)]
92pub struct CapacityFullError<T = ()>
93{
94    pub element: T,
95}
96
97impl<T> From<T> for CapacityFullError<T>
98{
99    fn from(value: T) -> Self { Self::new(value) }
100}
101
102impl<T> CapacityFullError<T>
103{
104    pub const fn new(element: T) -> CapacityFullError<T> { CapacityFullError { element: element } }
105}
106
107const CAPERROR: &'static str = "capacity full";
108
109#[cfg(feature = "std")]
110/// Requires `features="std"`.
111impl<T: Any> Error for CapacityFullError<T> {}
112
113impl<T> core::fmt::Display for CapacityFullError<T>
114{
115    fn fmt(&self, f: &mut Formatter) -> core::fmt::Result { write!(f, "{}", CAPERROR) }
116}
117
118impl<T> core::fmt::Debug for CapacityFullError<T>
119{
120    fn fmt(&self, f: &mut Formatter) -> core::fmt::Result
121    {
122        write!(f, "{}: {}", "CapacityError", CAPERROR)
123    }
124}
125
126
127#[derive(Clone, Copy, Eq, Ord, PartialEq, PartialOrd, Hash)]
128pub struct WrongLenError<T> {
129    pub remaining: T,
130}
131impl<T> From<T> for WrongLenError<T>
132{
133    fn from(value: T) -> Self { Self::new(value) }
134}
135
136impl<T> WrongLenError<T>
137{
138    pub const fn new(remaining: T) -> WrongLenError<T> { WrongLenError { remaining } }
139}
140impl<T> Debug for WrongLenError<T>
141{
142    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
143        write!(f, "Wrong len")
144    }
145}
146
147impl<T, const N: usize> TryFromIterator<T> for [T; N] {
148    type Error = WrongLenError<Vec<T>>;
149    fn try_from_iter<It: IntoIterator<Item = T>>(iter: It) -> Result<Self, Self::Error> {
150        let vec: Vec<T> = iter.into_iter().collect();
151        vec.try_into().map_err(|remaining| WrongLenError { remaining })
152    }
153}
154
155pub trait IterExtension<'a, Item>
156where
157    Self: 'a,
158    &'a Self: IntoIterator<Item = Item>,
159{
160    fn iter(&'a self) -> <&'a Self as IntoIterator>::IntoIter { self.into_iter() }
161}
162impl<'a, Item, T> IterExtension<'a, Item> for T where &'a T: IntoIterator<Item = Item> + 'a {}
163
164pub trait IterPredicate<Item>: IntoIterator<Item = Item> + Sized
165{
166    #[inline(always)]
167    fn any<P>(self, p: P) -> bool
168    where
169        P: FnMut(Item) -> bool,
170    {
171        self.into_iter().any(p)
172    }
173    #[inline(always)]
174    fn all<P>(self, p: P) -> bool
175    where
176        P: FnMut(Item) -> bool,
177    {
178        self.into_iter().all(p)
179    }
180    //#[inline(always)]
181    //fn for_each<F>(self, f: F) where F: FnMut(Item) { self.into_iter().for_each(f); }
182
183    #[inline(always)]
184    fn any_with<P, O>(self, other: O, mut p: P) -> bool
185    where
186        P: FnMut(Item, Item) -> bool,
187        O: IntoIterator<Item = Item>,
188    {
189        let it_a = self.into_iter();
190        let it_b = other.into_iter();
191        it_a.zip(it_b).any(|v| p(v.0, v.1))
192    }
193
194    #[inline(always)]
195    fn all_with<P, O>(self, other: O, mut p: P) -> bool
196    where
197        P: FnMut(Item, Item) -> bool,
198        O: IntoIterator<Item = Item>,
199    {
200        let it_a = self.into_iter();
201        let it_b = other.into_iter();
202        it_a.zip(it_b).all(|v| p(v.0, v.1))
203    }
204}
205impl<Item, T> IterPredicate<Item> for T where T: IntoIterator<Item = Item> + Sized {}
206
207pub trait IterMutExtension<'a, Item>
208where
209    Self: 'a + IterExtension<'a, Item>,
210    &'a Self: IntoIterator<Item = Item>,
211    &'a mut Self: IntoIterator<Item = Item>,
212{
213    fn iter_mut(&'a mut self) -> <&'a mut Self as IntoIterator>::IntoIter { self.into_iter() }
214
215    //fn for_each_mut<F>(&'a mut self, f: F) where F: FnMut(Item) { self.iter_mut().for_each(f); }
216}
217impl<'a, Item, T> IterMutExtension<'a, Item> for T
218where
219    &'a mut T: IntoIterator<Item = Item> + 'a,
220    &'a Self: IntoIterator<Item = Item>,
221{
222}