1use std_::mem;
2
3#[allow(unused_imports)]
4use super::ValSliceExt;
5
6
7#[inline(always)]
8fn next_split<'a,T, P, U: Eq + Clone>(
9 pred: &mut P,
10 s: &mut &'a [T],
11 last: &mut U,
12) -> Option<KeySlice<'a,T, U>>
13where
14 P: FnMut(&'a T) -> U,
15{
16 let mut next = last.clone();
17 if s.is_empty() {
18 return None;
19 }
20 let end = s.iter()
21 .position(|x|{
22 next=pred(x);
23 *last!=next
24 })
25 .unwrap_or(s.len());
26 let (ret, new_s) = s.split_at(end);
27 *s = new_s;
28 let key = mem::replace(last, next);
29 Some(KeySlice { slice: ret, key })
30}
31
32#[inline(always)]
33fn next_rsplit<'a, T, P, U: Eq + Clone>(
34 pred: &mut P,
35 s: &mut &'a [T],
36 last: &mut U,
37) -> Option<KeySlice<'a, T, U>>
38where
39 P: FnMut(&'a T) -> U,
40{
41 let mut next = last.clone();
42 if s.is_empty() {
43 return None;
44 }
45 let left = (*s).iter()
46 .rposition(|x|{
47 next=pred(x);
48 *last!=next
49 })
50 .map_or(0,|x|x+1);
51 let (new_s, ret) = s.split_at(left);
52 *s = new_s;
53 let key = mem::replace(last, next);
54 Some(KeySlice { slice: ret, key })
55}
56
57#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
64pub struct KeySlice<'a, T:'a, U> {
65 pub slice: &'a [T],
67 pub key: U,
69}
70
71impl<'a, T, U> KeySlice<'a, T, U> {
72 pub fn into_pair(self) -> (U, &'a [T]){
74 (self.key, self.slice)
75 }
76}
77
78#[derive(Debug, Clone)]
85pub struct SplitSliceWhile<'a, T:'a, P, U> {
86 pub(super) mapper: P,
87 pub(super) s: &'a [T],
88 pub(super) last_left: Option<U>,
89 pub(super) last_right: Option<U>,
90}
91
92impl<'a, T, P, U: Eq + Clone> Iterator for SplitSliceWhile<'a, T, P, U>
93where
94 P: FnMut(&'a T) -> U,
95{
96 type Item = KeySlice<'a, T, U>;
97 fn next(&mut self) -> Option<Self::Item> {
98 next_split(&mut self.mapper, &mut self.s,self.last_left.as_mut()?)
99 }
100 fn size_hint(&self)->(usize,Option<usize>){
101 let s=self.s;
102 let min_len=if s.is_empty() { 0 }else{ 1 };
103 ( min_len , Some(s.len()) )
104 }
105}
106
107impl<'a, T, P, U: Eq + Clone> DoubleEndedIterator for SplitSliceWhile<'a, T, P, U>
108where
109 P: FnMut(&'a T) -> U,
110{
111 fn next_back(&mut self) -> Option<Self::Item> {
112 next_rsplit(&mut self.mapper, &mut self.s, self.last_right.as_mut()?)
113 }
114}
115
116#[derive(Debug, Clone)]
124pub struct RSplitSliceWhile<'a, T:'a, P, U> {
125 pub(super) mapper: P,
126 pub(super) s: &'a [T],
127 pub(super) last_left: Option<U>,
128 pub(super) last_right: Option<U>,
129}
130
131impl<'a, T, P, U: Eq + Clone> Iterator for RSplitSliceWhile<'a, T, P, U>
132where
133 P: FnMut(&'a T) -> U,
134{
135 type Item = KeySlice<'a, T, U>;
136 fn next(&mut self) -> Option<Self::Item> {
137 next_rsplit(&mut self.mapper, &mut self.s, self.last_right.as_mut()?)
138 }
139 fn size_hint(&self)->(usize,Option<usize>){
140 let s=self.s;
141 let min_len=if s.is_empty() { 0 }else{ 1 };
142 ( min_len , Some(s.len()) )
143 }
144}
145
146impl<'a, T, P, U: Eq + Clone> DoubleEndedIterator for RSplitSliceWhile<'a, T, P, U>
147where
148 P: FnMut(&'a T) -> U,
149{
150 fn next_back(&mut self) -> Option<Self::Item> {
151 next_split(&mut self.mapper, &mut self.s, self.last_left.as_mut()?)
152 }
153}
154
155#[cfg(test)]
159#[cfg(feature = "alloc")]
160mod test{
161 use super::*;
162
163 use alloc::{
164 vec::Vec,
165 vec,
166 };
167
168 fn func<'a,T,U,F>(s:&'a [T],f:F)->Vec<(U,Vec<T>)>
169 where
170 T:Clone,
171 F:FnMut(&'a T)->U,
172 U:Eq+Clone,
173 {
174 s.split_while(f).map(|v| (v.key,v.slice.to_vec()) ).collect()
175 }
176
177 fn rfunc<'a,T,U,F>(s:&'a [T],f:F)->Vec<(U,Vec<T>)>
178 where
179 T:Clone,
180 F:FnMut(&'a T)->U,
181 U:Eq+Clone,
182 {
183 s.rsplit_while(f).map(|v| (v.key,v.slice.to_vec()) ).collect()
184 }
185
186 fn new_singletons()->Vec<Vec<u32>>{
187 (0..30).map(|x| vec![x] ).collect()
188 }
189
190 fn new_list_0()->Vec<u32>{
191 vec![0,9,1,4,5]
192 }
193 fn new_list_1()->Vec<u32>{
194 vec![90,91,92,93,94,95]
195 }
196 fn new_list_2()->Vec<u32>{
197 vec![10,5,4,17]
198 }
199 fn mapper_0(x:&u32)->u32{x%3}
200
201 fn mapper_1(x:&u32)->u32{*x}
202
203 fn mapper_2(x:&u32)->u32{x/3}
204
205 fn spair<T>(v:&T)->(T,Vec<T>)
206 where T:Clone
207 {
208 (v.clone(),vec![v.clone()])
209 }
210
211
212
213 #[test]
214 fn with_every_mapper(){
215
216 for mapper in vec![ mapper_0 as fn(&_)->_,mapper_1,mapper_2 ] {
217 assert_eq!(func(&vec![] ,mapper_0),vec![]);
218 assert_eq!(rfunc(&vec![] ,mapper_0),vec![]);
219
220 let singletons=new_singletons();
221 for list in singletons.iter() {
222 assert_eq!(func(list,mapper),vec![(mapper(&list[0]),list.clone())]);
223 assert_eq!(rfunc(list,mapper),vec![(mapper(&list[0]),list.clone())]);
224 }
225 }
226 }
227
228
229
230 #[test]
231 fn with_mapper_0(){
232 {
233 let list_0=new_list_0();
234 let mut expected=vec![(0,vec![0,9]),(1,vec![1,4]),(2,vec![5])];
235 assert_eq!(func(&list_0,mapper_0),expected);
236 expected.reverse();
237 assert_eq!(rfunc(&list_0,mapper_0),expected);
238 }
239 for list in vec![new_list_1(),new_list_2()] {
240 let mut expected=list.iter()
241 .map(|x| (mapper_0(x),vec![*x]) )
242 .collect::<Vec<_>>();
243 assert_eq!(func(&list,mapper_0),expected);
244 expected.reverse();
245 assert_eq!(rfunc(&list,mapper_0),expected);
246 }
247 }
248
249 #[test]
250 fn with_mapper_1(){
251 for list in vec![new_list_0(),new_list_1(),new_list_2()] {
252 let mut expected=list.iter().map(spair).collect::<Vec<_>>();
253 assert_eq!(func(&list,mapper_1),expected);
254 expected.reverse();
255 assert_eq!(rfunc(&list,mapper_1),expected);
256 }
257 }
258
259 #[test]
260 fn with_mapper_2(){
261 {
262 let list_0=new_list_0();
263 let mut expected=vec![(0,vec![0]),(3,vec![9]),(0,vec![1]),(1,vec![4,5])];
264 assert_eq!(func(&list_0,mapper_2),expected);
265 expected.reverse();
266 assert_eq!(rfunc(&list_0,mapper_2),expected);
267 }
268 {
269 let list_1=new_list_1();
270 let mut expected=vec![(30,vec![90,91,92]),(31,vec![93,94,95])];
271 assert_eq!(func(&list_1,mapper_2),expected);
272 expected.reverse();
273 assert_eq!(rfunc(&list_1,mapper_2),expected);
274 }
275 {
276 let list_2=new_list_2();
277 let mut expected=vec![(3,vec![10]),(1,vec![5,4]),(5,vec![17])];
278 assert_eq!(func(&list_2,mapper_2),expected);
279 expected.reverse();
280 assert_eq!(rfunc(&list_2,mapper_2),expected);
281 }
282 }
283
284
285
286}