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
9pub 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; 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")]
110impl<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)]
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 }
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}