1#![no_std]
2#![deny(missing_docs)]
3#![deny(clippy::all)]
4
5extern crate alloc;
85
86#[cfg(doctest)]
94extern crate std;
95
96#[cfg(doctest)]
103#[global_allocator]
104static A: std::alloc::System = std::alloc::System;
105
106use core::iter::FusedIterator;
107
108#[cfg(not(feature = "smallvec"))]
110use alloc::vec::Vec;
111
112#[cfg(feature = "smallvec")]
115use smallvec::SmallVec;
116
117pub trait PeekMore: Iterator + Sized {
124 fn peekmore(self) -> PeekMoreIterator<Self>;
126}
127
128impl<I: Iterator> PeekMore for I {
129 fn peekmore(self) -> PeekMoreIterator<I> {
130 PeekMoreIterator {
131 iterator: self,
132
133 #[cfg(not(feature = "smallvec"))]
134 queue: Vec::new(),
135
136 #[cfg(feature = "smallvec")]
137 queue: SmallVec::new(),
138
139 cursor: 0usize,
140 }
141 }
142}
143
144#[cfg(feature = "smallvec")]
147const DEFAULT_STACK_SIZE: usize = 8;
148
149#[derive(Clone, Debug)]
157pub struct PeekMoreIterator<I: Iterator> {
158 iterator: I,
161
162 #[cfg(not(feature = "smallvec"))]
166 queue: Vec<Option<I::Item>>,
167 #[cfg(feature = "smallvec")]
168 queue: SmallVec<[Option<I::Item>; DEFAULT_STACK_SIZE]>,
169
170 cursor: usize,
178}
179
180impl<I: Iterator> PeekMoreIterator<I> {
181 #[inline]
378 pub fn peek(&mut self) -> Option<&I::Item> {
379 self.fill_queue(self.cursor);
380 self.queue.get(self.cursor).and_then(|v| v.as_ref())
381 }
382
383 #[inline]
385 pub fn peek_first(&mut self) -> Option<&I::Item> {
386 self.peek_nth(0)
387 }
388
389 #[inline]
392 pub fn peek_next(&mut self) -> Option<&I::Item> {
393 let this = self.advance_cursor();
394 this.peek()
395 }
396
397 #[inline]
404 pub fn peek_previous(&mut self) -> Result<Option<&I::Item>, PeekMoreError> {
405 if self.cursor >= 1 {
406 self.move_cursor_back().map(|iter| iter.peek())
407 } else {
408 Err(PeekMoreError::ElementHasBeenConsumed)
409 }
410 }
411
412 #[inline]
414 pub fn peek_forward(&mut self, n: usize) -> Option<&I::Item> {
415 let this = self.advance_cursor_by(n);
416 this.peek()
417 }
418
419 #[inline]
431 pub fn peek_backward(&mut self, n: usize) -> Result<Option<&I::Item>, PeekMoreError> {
432 let _ = self.move_cursor_back_by(n)?;
433
434 Ok(self.peek())
435 }
436
437 #[inline]
441 pub fn peek_backward_or_first(&mut self, n: usize) -> Option<&I::Item> {
442 if self.move_cursor_back_by(n).is_err() {
443 self.reset_cursor();
444 }
445
446 self.peek()
447 }
448
449 #[inline]
451 pub fn peek_nth(&mut self, n: usize) -> Option<&I::Item> {
452 self.fill_queue(n);
453 self.queue.get(n).and_then(|v| v.as_ref())
454 }
455
456 #[inline]
465 pub fn advance_cursor(&mut self) -> &mut PeekMoreIterator<I> {
466 self.increment_cursor();
467 self
468 }
469
470 #[inline]
476 pub fn advance_cursor_by(&mut self, n: usize) -> &mut PeekMoreIterator<I> {
477 self.cursor += n;
478 self
479 }
480
481 #[inline]
490 pub fn advance_cursor_while<P: Fn(Option<&I::Item>) -> bool>(
491 &mut self,
492 predicate: P,
493 ) -> &mut PeekMoreIterator<I> {
494 let view = self.peek();
495
496 if predicate(view) {
497 self.increment_cursor();
498 self.advance_cursor_while(predicate)
499 } else {
500 self
501 }
502 }
503
504 #[inline]
513 pub fn move_cursor_back(&mut self) -> Result<&mut PeekMoreIterator<I>, PeekMoreError> {
514 if self.cursor >= 1 {
515 self.decrement_cursor();
516 Ok(self)
517 } else {
518 Err(PeekMoreError::ElementHasBeenConsumed)
519 }
520 }
521
522 #[inline]
532 pub fn move_cursor_back_by(
533 &mut self,
534 n: usize,
535 ) -> Result<&mut PeekMoreIterator<I>, PeekMoreError> {
536 if self.cursor < n {
537 Err(PeekMoreError::ElementHasBeenConsumed)
538 } else {
539 self.cursor -= n;
540 Ok(self)
541 }
542 }
543
544 #[inline]
548 pub fn move_cursor_back_or_reset(&mut self, n: usize) -> &mut PeekMoreIterator<I> {
549 if self.cursor < n {
550 self.reset_cursor();
551 } else {
552 self.cursor -= n;
553 }
554
555 self
556 }
557
558 #[inline]
560 pub fn move_nth(&mut self, n: usize) -> &mut PeekMoreIterator<I> {
561 self.cursor = n;
562 self
563 }
564
565 #[deprecated]
569 #[inline]
570 pub fn reset_view(&mut self) {
571 self.reset_cursor()
572 }
573
574 #[inline]
580 pub fn reset_cursor(&mut self) {
581 self.cursor = 0;
582 }
583
584 #[inline]
587 pub fn cursor(&self) -> usize {
588 self.cursor
589 }
590
591 #[inline]
593 fn fill_queue(&mut self, required_elements: usize) {
594 let stored_elements = self.queue.len();
595
596 if stored_elements <= required_elements {
597 for _ in stored_elements..=required_elements {
598 self.push_next_to_queue()
599 }
600 }
601 }
602
603 #[inline]
605 fn push_next_to_queue(&mut self) {
606 let item = self.iterator.next();
607 self.queue.push(item);
608 }
609
610 #[inline]
615 fn increment_cursor(&mut self) {
616 self.cursor = self.cursor.saturating_add(1);
618 }
619
620 #[inline]
625 fn decrement_cursor(&mut self) {
626 if self.cursor > core::usize::MIN {
627 self.cursor -= 1;
628 }
629 }
630
631 pub fn truncate_iterator_to_cursor(&mut self) {
650 if self.cursor < self.queue.len() {
651 self.queue.drain(0..self.cursor);
652 } else {
653 for _ in 0..self.cursor.saturating_sub(self.queue.len()) {
656 let _ = self.iterator.next();
657 }
658 self.queue.clear();
659 }
660
661 self.cursor = 0;
662 }
663
664 pub fn peek_range(&mut self, start: usize, end: usize) -> &[Option<I::Item>] {
696 assert!(
697 start <= end,
698 "range of the peeked view [start, end] should be positive (i.e. start <= end)"
699 );
700
701 if end > self.queue.len() {
703 self.fill_queue(end);
704 }
705
706 &self.queue.as_slice()[start..end]
709 }
710
711 #[inline]
742 pub fn peek_amount(&mut self, n: usize) -> &[Option<I::Item>] {
743 self.peek_range(0, n)
744 }
745
746 #[inline]
778 pub fn next_if(&mut self, func: impl FnOnce(&I::Item) -> bool) -> Option<I::Item> {
779 match self.peek_first() {
780 Some(matched) if func(matched) => self.next(),
781 _ => None,
782 }
783 }
784
785 #[inline]
791 pub fn next_if_eq<T>(&mut self, expected: &T) -> Option<I::Item>
792 where
793 T: ?Sized,
794 I::Item: PartialEq<T>,
795 {
796 self.next_if(|next| next == expected)
797 }
798}
799
800impl<I: Iterator> Iterator for PeekMoreIterator<I> {
801 type Item = I::Item;
802
803 fn next(&mut self) -> Option<Self::Item> {
804 let res = if self.queue.is_empty() {
805 self.iterator.next()
806 } else {
807 self.queue.remove(0)
808 };
809
810 self.decrement_cursor();
811
812 res
813 }
814}
815
816impl<I: ExactSizeIterator> ExactSizeIterator for PeekMoreIterator<I> {}
820
821impl<I: FusedIterator> FusedIterator for PeekMoreIterator<I> {}
825
826#[derive(Debug, Eq, PartialEq)]
830pub enum PeekMoreError {
831 ElementHasBeenConsumed,
835}
836
837#[cfg(test)]
838mod tests {
839 use super::*;
840
841 #[test]
842 fn readme_example() {
843 let range10 = 0..11;
844 let mut peekable = range10.peekmore();
845
846 let peek_first = peekable.peek();
848 assert_eq!(*peek_first.unwrap(), 0);
849
850 let peek_first_redux = peekable.peek_nth(0);
851 assert_eq!(*peek_first_redux.unwrap(), 0);
852
853 let peek_tenth = peekable.peek_nth(10);
855 assert_eq!(*peek_tenth.unwrap(), 10);
856
857 let tenth = peekable.nth(10);
859 assert_eq!(tenth.unwrap(), 10);
860
861 assert_eq!(peekable.peek(), None);
863 assert_eq!(peekable.next(), None);
864 }
865
866 #[test]
867 fn peek_forward_with_reassignment() {
868 let iterable = [1, 2, 3, 4];
869
870 let mut peek = iterable.iter().peekmore();
871
872 assert_eq!(peek.peek(), Some(&&1));
873
874 let peek = peek.advance_cursor();
875 assert_eq!(peek.peek(), Some(&&2));
876
877 let peek = peek.advance_cursor();
878 assert_eq!(peek.peek(), Some(&&3));
879
880 let peek = peek.advance_cursor();
881 assert_eq!(peek.peek(), Some(&&4));
882
883 let peek = peek.advance_cursor();
884 assert_eq!(peek.peek(), None);
885 }
886
887 #[test]
888 fn peek_forward_without_reassignment_separately_advance_and_peek() {
889 let iterable = [1, 2, 3, 4];
890
891 let mut iter = iterable.iter().peekmore();
892
893 assert_eq!(iter.peek(), Some(&&1));
894
895 let v2 = iter.advance_cursor().peek();
896 assert_eq!(v2, Some(&&2));
897
898 let v3 = iter.advance_cursor().peek();
899 assert_eq!(v3, Some(&&3));
900
901 let v4 = iter.advance_cursor().peek();
902 assert_eq!(v4, Some(&&4));
903
904 let v5 = iter.advance_cursor().peek();
905 assert_eq!(v5, None);
906 }
907
908 #[test]
909 fn peek_forward_without_reassignment_advance_and_peek_combined() {
910 let iterable = [1, 2, 3, 4];
911
912 let mut iter = iterable.iter().peekmore();
913
914 let v1 = iter.peek();
915 assert_eq!(v1, Some(&&1));
916
917 let v2 = iter.peek_next();
918 assert_eq!(v2, Some(&&2));
919
920 let v3 = iter.peek_next();
921 assert_eq!(v3, Some(&&3));
922
923 let v4 = iter.peek_next();
924 assert_eq!(v4, Some(&&4));
925
926 let v5 = iter.peek_next();
927 assert_eq!(v5, None);
928 }
929
930 #[test]
931 fn peek_forward_without_reassignment_advance_and_peek_combined_and_reset_view() {
932 let iterable = [1, 2, 3, 4];
933
934 let mut iter = iterable.iter().peekmore();
935
936 let v1 = iter.peek();
937 assert_eq!(v1, Some(&&1));
938
939 let v2 = iter.peek_next();
940 assert_eq!(v2, Some(&&2));
941
942 iter.reset_cursor();
943 let v1again = iter.peek();
944 assert_eq!(v1again, Some(&&1));
945
946 let v2again = iter.peek_next();
947 assert_eq!(v2again, Some(&&2));
948
949 let v3 = iter.peek_next();
950 assert_eq!(v3, Some(&&3));
951
952 let v4 = iter.peek_next();
953 assert_eq!(v4, Some(&&4));
954
955 let v5 = iter.peek_next();
956 assert_eq!(v5, None);
957 }
958
959 #[test]
960 fn empty() {
961 let iterable: [i32; 0] = [];
962
963 let mut iter = iterable.iter().peekmore();
964
965 assert_eq!(iter.peek(), None);
966
967 let none = iter.peek_next();
968 assert_eq!(none, None);
969
970 let iter = iter.advance_cursor();
971 assert_eq!(iter.peek(), None);
972 assert_eq!(iter.peek_next(), None);
973 }
974
975 #[test]
976 fn test_with_consume() {
977 let iterable = "123".chars();
978
979 let mut iter = iterable.peekmore();
980 assert_eq!(iter.peek(), Some(&core::char::from_digit(1, 10).unwrap()));
981 assert_eq!(
982 iter.peek_next(),
983 Some(&core::char::from_digit(2, 10).unwrap())
984 );
985 assert_eq!(
986 iter.peek_next(),
987 Some(&core::char::from_digit(3, 10).unwrap())
988 );
989 assert_eq!(iter.peek_next(), None);
990 assert_eq!(iter.next(), Some(core::char::from_digit(1, 10).unwrap()));
991 assert_eq!(iter.peek(), None);
992 assert_eq!(iter.peek_next(), None);
993 assert_eq!(iter.next(), Some(core::char::from_digit(2, 10).unwrap()));
994 assert_eq!(iter.peek(), None);
995 assert_eq!(iter.peek_next(), None);
996 assert_eq!(iter.next(), Some(core::char::from_digit(3, 10).unwrap()));
997 assert_eq!(iter.next(), None);
998 assert_eq!(iter.peek_next(), None);
999 }
1000
1001 #[test]
1002 fn test_with_consume_and_reset() {
1003 let iterable = "456".chars();
1004
1005 let mut iter = iterable.peekmore();
1006 assert_eq!(iter.peek(), Some(&core::char::from_digit(4, 10).unwrap()));
1007 assert_eq!(
1008 iter.peek_next(),
1009 Some(&core::char::from_digit(5, 10).unwrap())
1010 );
1011 assert_eq!(
1012 iter.peek_next(),
1013 Some(&core::char::from_digit(6, 10).unwrap())
1014 );
1015 assert_eq!(iter.peek_next(), None);
1016 assert_eq!(iter.next(), Some(core::char::from_digit(4, 10).unwrap()));
1017 iter.reset_cursor();
1018
1019 assert_eq!(iter.peek(), Some(&core::char::from_digit(5, 10).unwrap()));
1020 assert_eq!(
1021 iter.peek_next(),
1022 Some(&core::char::from_digit(6, 10).unwrap())
1023 );
1024
1025 assert_eq!(iter.next(), Some(core::char::from_digit(5, 10).unwrap()));
1026 assert_eq!(iter.next(), Some(core::char::from_digit(6, 10).unwrap()));
1027 assert_eq!(iter.next(), None);
1028 assert_eq!(iter.peek_next(), None);
1029 }
1030
1031 #[test]
1032 fn check_peek_window_moves_with_consume() {
1033 let iterable = [1, 2, 3, 4];
1034
1035 let mut iter = iterable.iter().peekmore();
1036
1037 let v1 = iter.peek();
1038 assert_eq!(v1, Some(&&1));
1039
1040 let v1c = iter.next();
1041 assert_eq!(v1c, Some(&1));
1042
1043 let v2 = iter.peek();
1044 assert_eq!(v2, Some(&&2));
1045
1046 let v2c = iter.next();
1047 assert_eq!(v2c, Some(&2));
1048
1049 let v3 = iter.peek();
1050 assert_eq!(v3, Some(&&3));
1051
1052 iter.reset_cursor();
1053
1054 let v3 = iter.peek();
1055 assert_eq!(v3, Some(&&3));
1056
1057 let v3c = iter.next();
1058 assert_eq!(v3c, Some(&3));
1059
1060 let v4c = iter.next();
1061 assert_eq!(v4c, Some(&4));
1062
1063 let v5 = iter.peek();
1064 assert_eq!(v5, None);
1065
1066 let v5c = iter.next();
1067 assert_eq!(v5c, None);
1068 }
1069
1070 #[test]
1071 fn check_advance_separately() {
1072 let iterable = [1, 2, 3, 4];
1073
1074 let mut iter = iterable.iter().peekmore(); assert_eq!(iter.cursor(), 0);
1077 assert_eq!(iter.peek(), Some(&&1));
1078
1079 iter.advance_cursor(); assert_eq!(iter.cursor(), 1);
1081
1082 iter.advance_cursor(); assert_eq!(iter.cursor(), 2);
1084
1085 iter.advance_cursor(); assert_eq!(iter.cursor(), 3);
1087
1088 let v4 = iter.peek();
1089 assert_eq!(v4, Some(&&4));
1090 }
1091
1092 #[test]
1093 fn check_advance_chain() {
1094 let iterable = [1, 2, 3, 4];
1095
1096 let mut iter = iterable.iter().peekmore(); assert_eq!(iter.cursor(), 0);
1099
1100 iter.advance_cursor() .advance_cursor() .advance_cursor(); let v4 = iter.peek();
1105 assert_eq!(v4, Some(&&4));
1106 }
1107
1108 #[test]
1109 fn check_move_previous() {
1110 let iterable = [1, 2, 3, 4];
1111
1112 let mut iter = iterable.iter().peekmore(); assert_eq!(iter.cursor(), 0);
1115 assert_eq!(iter.peek(), Some(&&1));
1116
1117 iter.advance_cursor(); assert_eq!(iter.cursor(), 1);
1119
1120 let _ = iter.move_cursor_back(); assert_eq!(iter.cursor(), 0);
1122
1123 iter.advance_cursor(); assert_eq!(iter.cursor(), 1);
1125
1126 let _ = iter.move_cursor_back(); assert_eq!(iter.cursor(), 0);
1128
1129 iter.advance_cursor(); assert_eq!(iter.cursor(), 1);
1131
1132 iter.advance_cursor() .advance_cursor(); assert_eq!(iter.cursor(), 3);
1136
1137 let v4 = iter.peek();
1138 assert_eq!(v4, Some(&&4));
1139
1140 let _ = iter.move_cursor_back().and_then(|it| {
1141 it.move_cursor_back() .and_then(|it| {
1143 it.move_cursor_back() .and_then(|it| it.move_cursor_back())
1145 })
1146 }); let v1 = iter.peek();
1149 assert_eq!(v1, Some(&&1));
1150
1151 let prev = iter.move_cursor_back();
1152 assert!(prev.is_err());
1153
1154 let v1 = iter.peek();
1155 assert_eq!(v1, Some(&&1));
1156 }
1157
1158 #[test]
1159 fn test_with_inherited_feature_count() {
1160 let iterable = [1, 2, 3];
1161 let mut iter = iterable.iter().peekmore();
1162
1163 iter.advance_cursor();
1164 let second = iter.peek().unwrap();
1165 assert_eq!(second, &&2);
1166
1167 let consume_first = iter.next().unwrap();
1168 assert_eq!(consume_first, &1);
1169
1170 let count = iter.count();
1171 assert_eq!(count, 2);
1172 }
1173
1174 #[test]
1175 fn peek_previous() {
1176 let iterable = [1, 2, 3];
1177 let mut iter = iterable.iter().peekmore(); iter.advance_cursor(); iter.advance_cursor(); let value = iter.peek().unwrap(); assert_eq!(value, &&3);
1183
1184 let peek = iter.peek_previous(); assert_eq!(peek.unwrap(), Some(&&2));
1186 assert_eq!(iter.cursor(), 1);
1187
1188 let peek = iter.peek_previous(); assert_eq!(peek.unwrap(), Some(&&1));
1190 assert_eq!(iter.cursor(), 0);
1191
1192 let peek = iter.peek_previous();
1193 assert_eq!(peek, Err(PeekMoreError::ElementHasBeenConsumed));
1194 assert_eq!(iter.cursor(), 0);
1195 }
1196
1197 #[test]
1198 fn peek_previous_beyond_none() {
1199 let iterable = [1];
1200 let mut iter = iterable.iter().peekmore(); assert_eq!(iter.cursor(), 0);
1202
1203 iter.advance_cursor(); let peek = iter.peek();
1205 assert_eq!(peek, None);
1206 assert_eq!(iter.cursor(), 1);
1207
1208 iter.advance_cursor(); let peek = iter.peek();
1210 assert_eq!(peek, None);
1211 assert_eq!(iter.cursor(), 2);
1212
1213 iter.advance_cursor(); let peek = iter.peek(); assert_eq!(peek, None);
1216 assert_eq!(iter.cursor(), 3);
1217
1218 let peek = iter.peek_previous(); assert_eq!(peek.unwrap(), None);
1220 assert_eq!(iter.cursor(), 2);
1221
1222 let peek = iter.peek_previous(); assert_eq!(peek.unwrap(), None);
1224 assert_eq!(iter.cursor(), 1);
1225
1226 let peek = iter.peek_previous(); assert_eq!(peek.unwrap(), Some(&&1));
1228 assert_eq!(iter.cursor(), 0);
1229
1230 let peek = iter.peek_previous();
1231 assert_eq!(peek, Err(PeekMoreError::ElementHasBeenConsumed));
1232 assert_eq!(iter.cursor(), 0);
1233
1234 let peek = iter.peek_previous();
1235 assert_eq!(peek, Err(PeekMoreError::ElementHasBeenConsumed));
1236 assert_eq!(iter.cursor(), 0);
1237 }
1238
1239 #[test]
1240 fn check_move_forward() {
1241 let iterable = [1, 2, 3, 4];
1242 let mut iter = iterable.iter().peekmore();
1243
1244 let _ = iter.advance_cursor_by(3);
1245
1246 let peek = iter.peek();
1247 assert_eq!(peek, Some(&&4));
1248 assert_eq!(iter.cursor(), 3);
1249
1250 let _ = iter.advance_cursor_by(3);
1251 let peek = iter.peek();
1252 assert_eq!(peek, None);
1253 assert_eq!(iter.cursor(), 6);
1254 }
1255
1256 #[test]
1257 fn check_move_backward() {
1258 let iterable = [1, 2, 3, 4];
1259 let mut iter = iterable.iter().peekmore();
1260
1261 let _ = iter.advance_cursor_by(3);
1262
1263 let peek = iter.peek();
1264 assert_eq!(peek, Some(&&4));
1265 assert_eq!(iter.cursor(), 3);
1266
1267 let result = iter.move_cursor_back_by(2);
1268 assert!(result.is_ok());
1269 let peek = iter.peek();
1270 assert_eq!(peek, Some(&&2));
1271 assert_eq!(iter.cursor(), 1);
1272
1273 let result = iter.move_cursor_back_by(1);
1274 assert!(result.is_ok());
1275 let peek = iter.peek();
1276 assert_eq!(peek, Some(&&1));
1277 assert_eq!(iter.cursor(), 0);
1278
1279 let result = iter.move_cursor_back_by(1);
1280 assert!(result.is_err());
1281 let peek = iter.peek();
1282 assert_eq!(peek, Some(&&1));
1283 assert_eq!(iter.cursor(), 0);
1284 }
1285
1286 #[test]
1287 fn check_move_backward_beyond_consumed_verify_cursor_position() {
1288 let iterable = [1, 2, 3, 4];
1289 let mut iter = iterable.iter().peekmore();
1290
1291 let _ = iter.advance_cursor_by(3);
1292
1293 let peek = iter.peek();
1294 assert_eq!(peek, Some(&&4));
1295 assert_eq!(iter.cursor(), 3);
1296
1297 let result = iter.move_cursor_back_by(5);
1298 assert!(result.is_err());
1299 let peek = iter.peek();
1300 assert_eq!(peek, Some(&&4));
1301 assert_eq!(iter.cursor(), 3);
1302 }
1303
1304 #[test]
1305 fn check_move_backward_or_reset() {
1306 let iterable = [1, 2, 3, 4];
1307 let mut iter = iterable.iter().peekmore();
1308
1309 let _ = iter.advance_cursor_by(3);
1310
1311 let peek = iter.peek();
1312 assert_eq!(peek, Some(&&4));
1313 assert_eq!(iter.cursor(), 3);
1314
1315 let _ = iter.move_cursor_back_or_reset(2);
1316 let peek = iter.peek();
1317 assert_eq!(peek, Some(&&2));
1318 assert_eq!(iter.cursor(), 1);
1319
1320 let _ = iter.move_cursor_back_or_reset(1);
1321 let peek = iter.peek();
1322 assert_eq!(peek, Some(&&1));
1323 assert_eq!(iter.cursor(), 0);
1324
1325 let _ = iter.move_cursor_back_or_reset(1);
1326 let peek = iter.peek();
1327 assert_eq!(peek, Some(&&1));
1328 assert_eq!(iter.cursor(), 0);
1329 }
1330
1331 #[test]
1332 fn check_move_backward_or_reset_beyond_consumed_verify_cursor_position() {
1333 let iterable = [1, 2, 3, 4];
1334 let mut iter = iterable.iter().peekmore();
1335
1336 let _ = iter.advance_cursor_by(3);
1337
1338 let peek = iter.peek();
1339 assert_eq!(peek, Some(&&4));
1340 assert_eq!(iter.cursor(), 3);
1341
1342 let _ = iter.move_cursor_back_or_reset(5);
1343 let peek = iter.peek();
1344 assert_eq!(peek, Some(&&1));
1345 assert_eq!(iter.cursor(), 0);
1346 }
1347
1348 #[test]
1349 fn check_move_backward_or_reset_empty() {
1350 let iterable = "".chars();
1351
1352 let mut iter = iterable.peekmore();
1353
1354 assert_eq!(iter.peek(), None);
1355 assert_eq!(iter.cursor(), 0);
1356
1357 let _ = iter.move_cursor_back_or_reset(5);
1358
1359 assert_eq!(iter.peek(), None);
1360 assert_eq!(iter.cursor(), 0);
1361 }
1362
1363 #[test]
1364 fn check_peek_forward() {
1365 let iterable = [1, 2, 3, 4];
1366 let mut iter = iterable.iter().peekmore();
1367
1368 let peek = iter.peek_forward(3);
1369
1370 assert_eq!(peek, Some(&&4));
1371 assert_eq!(iter.cursor(), 3);
1372
1373 let peek = iter.peek_forward(3);
1374 assert_eq!(peek, None);
1375 assert_eq!(iter.cursor(), 6);
1376 }
1377
1378 #[test]
1379 fn check_peek_backward() {
1380 let iterable = [1, 2, 3, 4];
1381 let mut iter = iterable.iter().peekmore();
1382
1383 let _ = iter.advance_cursor_by(3);
1384
1385 let peek = iter.peek();
1386 assert_eq!(peek, Some(&&4));
1387 assert_eq!(iter.cursor(), 3);
1388
1389 let result = iter.peek_backward(2);
1390 assert!(result.is_ok());
1391 assert_eq!(result.unwrap(), Some(&&2));
1392 assert_eq!(iter.cursor(), 1);
1393
1394 let result = iter.peek_backward(1);
1395 assert!(result.is_ok());
1396 assert_eq!(result.unwrap(), Some(&&1));
1397 assert_eq!(iter.cursor(), 0);
1398
1399 let result = iter.peek_backward(1);
1400 assert!(result.is_err());
1401 let peek = iter.peek();
1402 assert_eq!(peek, Some(&&1));
1403 assert_eq!(iter.cursor(), 0);
1404 }
1405
1406 #[test]
1407 fn check_peek_backward_beyond_consumed_verify_cursor_position() {
1408 let iterable = [1, 2, 3, 4];
1409 let mut iter = iterable.iter().peekmore();
1410
1411 let _ = iter.advance_cursor_by(3);
1412
1413 let peek = iter.peek();
1414 assert_eq!(peek, Some(&&4));
1415 assert_eq!(iter.cursor(), 3);
1416
1417 let result = iter.peek_backward(5);
1418 assert!(result.is_err());
1419 let peek = iter.peek();
1420 assert_eq!(peek, Some(&&4));
1421 assert_eq!(iter.cursor(), 3);
1422 }
1423
1424 #[test]
1425 fn check_peek_backward_or_first_beyond_consumed_verify_cursor_position() {
1426 let iterable = [1, 2, 3, 4];
1427 let mut iter = iterable.iter().peekmore();
1428
1429 let _ = iter.advance_cursor_by(3);
1430
1431 let peek = iter.peek();
1432 assert_eq!(peek, Some(&&4));
1433 assert_eq!(iter.cursor(), 3);
1434
1435 let peek = iter.peek_backward_or_first(5);
1436 assert_eq!(peek, Some(&&1));
1437 assert_eq!(iter.cursor(), 0);
1438 }
1439
1440 #[test]
1441 fn check_peek_backward_or_first_empty() {
1442 let iterable = "".chars();
1443
1444 let mut iter = iterable.peekmore();
1445
1446 assert_eq!(iter.peek(), None);
1447 assert_eq!(iter.cursor(), 0);
1448
1449 let peek = iter.peek_backward_or_first(5);
1450
1451 assert_eq!(peek, None);
1452 assert_eq!(iter.cursor(), 0);
1453 }
1454
1455 #[test]
1456 fn check_move_forward_while() {
1457 let iterable = [1, 2, 3, 4];
1458 let mut iter = iterable.iter().peekmore();
1459
1460 let _ = iter.advance_cursor_while(|i| **i.unwrap() != 3);
1461
1462 let peek = iter.peek();
1463 assert_eq!(peek, Some(&&3));
1464 assert_eq!(iter.cursor(), 2);
1465 }
1466
1467 #[test]
1468 fn check_move_forward_while_empty() {
1469 let iterable: [i32; 0] = [];
1470 let mut iter = iterable.iter().peekmore();
1471
1472 let _ = iter.advance_cursor_while(|i| if let Some(i) = i { **i != 3 } else { false });
1473
1474 let peek = iter.peek();
1475 assert_eq!(peek, None);
1476 assert_eq!(iter.cursor(), 0);
1477 }
1478
1479 #[test]
1480 fn check_move_forward_while_some() {
1481 let iterable = [1, 2, 3, 4];
1482 let mut iter = iterable.iter().peekmore();
1483
1484 let _ = iter.advance_cursor_while(|i| i.is_some());
1485
1486 let peek = iter.peek();
1487 assert_eq!(peek, None);
1488 assert_eq!(iter.cursor(), 4);
1489 }
1490
1491 #[test]
1492 fn check_move_forward_while_fast_fail() {
1493 let iterable = [1, 2, 3, 4];
1494 let mut iter = iterable.iter().peekmore();
1495
1496 iter.advance_cursor_by(2);
1497
1498 let _ = iter.advance_cursor_while(|i| **i.unwrap() > 3);
1499
1500 let peek = iter.peek();
1501 assert_eq!(peek, Some(&&3));
1502 assert_eq!(iter.cursor(), 2);
1503 }
1504
1505 #[test]
1506 fn check_peek_nth() {
1507 let iterable = [1, 2, 3, 4];
1508
1509 let mut iter = iterable.iter().peekmore();
1510
1511 assert_eq!(iter.peek_nth(0), Some(&&1));
1512 assert_eq!(iter.cursor(), 0);
1513 assert_eq!(iter.peek_nth(1), Some(&&2));
1514 assert_eq!(iter.cursor(), 0);
1515 assert_eq!(iter.peek_nth(2), Some(&&3));
1516 assert_eq!(iter.cursor(), 0);
1517 assert_eq!(iter.peek_nth(3), Some(&&4));
1518 assert_eq!(iter.cursor(), 0);
1519 assert_eq!(iter.peek_nth(4), None);
1520 assert_eq!(iter.cursor(), 0);
1521 }
1522
1523 #[test]
1524 fn check_peek_first() {
1525 let iterable = [1, 2, 3, 4];
1526 let mut iter = iterable.iter().peekmore();
1527
1528 assert_eq!(iter.peek_first(), Some(&&1));
1531 assert_eq!(iter.cursor(), 0);
1532 iter.increment_cursor();
1533 assert_eq!(iter.peek_first(), Some(&&1));
1534 assert_eq!(iter.cursor(), 1);
1535 iter.increment_cursor();
1536 assert_eq!(iter.peek_first(), Some(&&1));
1537 assert_eq!(iter.cursor(), 2);
1538 iter.increment_cursor();
1539 assert_eq!(iter.peek_first(), Some(&&1));
1540 assert_eq!(iter.cursor(), 3);
1541 iter.increment_cursor(); assert_eq!(iter.peek_first(), Some(&&1));
1543
1544 iter.next();
1547 assert_eq!(iter.peek_first(), Some(&&2));
1548 iter.increment_cursor();
1549 assert_eq!(iter.peek_first(), Some(&&2));
1550
1551 iter.next(); iter.next(); assert_eq!(iter.peek_first(), Some(&&4));
1555
1556 iter.next();
1558 assert_eq!(iter.peek_first(), None);
1559 }
1560
1561 #[test]
1562 fn check_peek_nth_empty() {
1563 let iterable: [i32; 0] = [];
1564
1565 let mut iter = iterable.iter().peekmore();
1566
1567 assert_eq!(iter.peek_nth(0), None);
1568 assert_eq!(iter.cursor(), 0);
1569 assert_eq!(iter.peek_nth(1), None);
1570 assert_eq!(iter.cursor(), 0);
1571 }
1572
1573 #[test]
1574 fn check_move_nth() {
1575 let iterable = [1, 2, 3, 4];
1576
1577 let mut iter = iterable.iter().peekmore();
1578
1579 iter.move_nth(20);
1580 assert_eq!(iter.peek_nth(0), Some(&&1));
1581 assert_eq!(iter.cursor(), 20);
1582 assert_eq!(iter.peek(), None);
1583
1584 iter.move_nth(0);
1585 assert_eq!(iter.peek(), Some(&&1));
1586
1587 iter.move_nth(3);
1588 assert_eq!(iter.peek(), Some(&&4));
1589 }
1590
1591 #[test]
1592 fn check_move_nth_empty() {
1593 let iterable: [i32; 0] = [];
1594
1595 let mut iter = iterable.iter().peekmore();
1596
1597 iter.move_nth(0);
1598 assert_eq!(iter.cursor(), 0);
1599
1600 iter.move_nth(10);
1601 assert_eq!(iter.cursor(), 10);
1602 }
1603
1604 #[test]
1605 fn truncate_iterator_to_cursor_is_noop_when_queue_is_empty_from_no_peeking() {
1606 let iterable = [1, 2, 3, 4];
1607
1608 let mut iter = iterable.iter().peekmore();
1609
1610 assert!(iter.queue.is_empty());
1611
1612 iter.truncate_iterator_to_cursor();
1613
1614 assert!(iter.queue.is_empty());
1615 assert_eq!(iter.peek(), Some(&&1));
1616 assert!(!iter.queue.is_empty());
1617 }
1618
1619 #[test]
1620 fn truncate_iterator_to_cursor_is_noop_when_queue_is_empty_from_iteration() {
1621 let iterable = [1, 2, 3, 4];
1622
1623 let mut iter = iterable.iter().peekmore();
1624
1625 assert!(iter.queue.is_empty());
1626
1627 iter.peek_forward(2);
1628 iter.next();
1629 iter.next();
1630 iter.next();
1631
1632 assert!(iter.queue.is_empty());
1633
1634 iter.truncate_iterator_to_cursor();
1635
1636 assert!(iter.queue.is_empty());
1637 assert_eq!(iter.peek(), Some(&&4));
1638 assert!(!iter.queue.is_empty());
1639 }
1640
1641 #[test]
1642 fn truncate_to_iterator_fill_queue() {
1643 let mut iter = [0, 1, 2, 3].iter().peekmore();
1644 iter.advance_cursor();
1645 iter.truncate_iterator_to_cursor();
1646
1647 let value = **iter.peek().unwrap();
1648
1649 assert_eq!(value, 1);
1650 }
1651
1652 #[test]
1653 fn truncate_to_iterator_on_empty_collection() {
1654 let mut iter = core::iter::empty::<i32>().peekmore();
1655 iter.advance_cursor();
1656 assert_eq!(iter.cursor, 1);
1657
1658 iter.truncate_iterator_to_cursor();
1659 assert_eq!(iter.cursor, 0);
1660
1661 assert!(iter.peek().is_none());
1662 }
1663
1664 #[test]
1665 fn truncate_to_iterator_on_single_element_collection() {
1666 let mut iter = core::iter::once(0).peekmore();
1667 assert_eq!(*iter.peek().unwrap(), 0);
1668 assert_eq!(iter.cursor, 0);
1669
1670 iter.advance_cursor(); assert_eq!(iter.cursor, 1);
1672 assert!(iter.peek().is_none());
1673
1674 iter.truncate_iterator_to_cursor();
1675 assert_eq!(iter.cursor, 0);
1676
1677 assert!(iter.peek().is_none());
1678 }
1679
1680 #[test]
1681 fn truncate_to_iterator_cursor_and_queue_equal_length() {
1682 let mut iter = [0, 1, 2, 3].iter().peekmore();
1683 iter.peek();
1684 iter.advance_cursor();
1685 iter.truncate_iterator_to_cursor();
1686
1687 assert_eq!(iter.next(), Some(&1));
1688 assert_eq!(iter.next(), Some(&2));
1689 assert_eq!(iter.next(), Some(&3));
1690 assert_eq!(iter.next(), None);
1691 }
1692
1693 #[test]
1694 fn truncate_to_iterator_cursor_less_than_queue_length() {
1695 let mut iter = [0, 1, 2, 3].iter().peekmore();
1696 iter.peek_nth(2);
1697 iter.truncate_iterator_to_cursor();
1698
1699 assert_eq!(iter.next(), Some(&0));
1700 assert_eq!(iter.next(), Some(&1));
1701 assert_eq!(iter.next(), Some(&2));
1702 assert_eq!(iter.next(), Some(&3));
1703 assert_eq!(iter.next(), None);
1704
1705 let mut iter = [0, 1, 2, 3].iter().peekmore();
1706 iter.peek_nth(3);
1707 iter.advance_cursor();
1708 iter.truncate_iterator_to_cursor();
1709
1710 assert_eq!(iter.next(), Some(&1));
1711 assert_eq!(iter.next(), Some(&2));
1712 assert_eq!(iter.next(), Some(&3));
1713 assert_eq!(iter.next(), None);
1714 }
1715
1716 #[test]
1717 fn peek_range_from_start_smaller_than_input_len() {
1718 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1719 let view = peeking_queue.peek_range(0, 2);
1720
1721 assert_eq!(view[0], Some(&0));
1722 assert_eq!(view[1], Some(&1));
1723 assert_eq!(view.len(), 2);
1724 }
1725
1726 #[test]
1727 fn peek_range_from_start_eq_to_input_len() {
1728 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1729 let view = peeking_queue.peek_range(0, 4);
1730
1731 assert_eq!(view[0], Some(&0));
1732 assert_eq!(view[1], Some(&1));
1733 assert_eq!(view[2], Some(&2));
1734 assert_eq!(view[3], Some(&3));
1735 assert_eq!(view.len(), 4);
1736 }
1737
1738 #[test]
1739 fn peek_range_from_start_bigger_than_input_len() {
1740 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1741 let view = peeking_queue.peek_range(0, 6);
1742
1743 assert_eq!(view[0], Some(&0));
1744 assert_eq!(view[1], Some(&1));
1745 assert_eq!(view[2], Some(&2));
1746 assert_eq!(view[3], Some(&3));
1747 assert_eq!(view[4], None);
1748 assert_eq!(view[5], None);
1749 assert_eq!(view.len(), 6);
1750 }
1751
1752 #[test]
1753 fn peek_range_from_middle() {
1754 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1755 let view = peeking_queue.peek_range(2, 5);
1756
1757 assert_eq!(view[0], Some(&2));
1758 assert_eq!(view[1], Some(&3));
1759 assert_eq!(view[2], None);
1760 assert_eq!(view.len(), 3);
1761 }
1762
1763 #[test]
1764 fn peek_range_out_of_bounds() {
1765 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1766 let view = peeking_queue.peek_range(5, 6);
1767
1768 assert_eq!(view[0], None);
1769 assert_eq!(view.len(), 1);
1770 }
1771
1772 #[test]
1773 fn peek_range_empty() {
1774 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1775 let view = peeking_queue.peek_range(0, 0);
1776
1777 assert_eq!(view.len(), 0);
1778 }
1779
1780 #[test]
1781 fn peek_range_match() {
1782 let mut peeking_queue = ["call", "f", "1"].iter().peekmore();
1783 let view = peeking_queue.peek_range(1, 3);
1784
1785 let value = match view {
1786 [Some(&"f"), Some(arg)] => arg,
1787 _ => panic!("test case peek_range_match failed"),
1788 };
1789
1790 assert_eq!(**value, "1");
1791 assert_eq!(view.len(), 2);
1792 }
1793
1794 #[test]
1795 #[should_panic]
1796 fn peek_range_panic_on_invalid_range() {
1797 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1798 let _ = peeking_queue.peek_range(2, 1);
1799 }
1800
1801 #[test]
1802 fn peek_amount_from_start_smaller_than_input_len() {
1803 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1804 let view = peeking_queue.peek_amount(2);
1805
1806 assert_eq!(view[0], Some(&0));
1807 assert_eq!(view[1], Some(&1));
1808 assert_eq!(view.len(), 2);
1809 }
1810
1811 #[test]
1812 fn peek_amount_from_start_eq_to_input_len() {
1813 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1814 let view = peeking_queue.peek_amount(4);
1815
1816 assert_eq!(view[0], Some(&0));
1817 assert_eq!(view[1], Some(&1));
1818 assert_eq!(view[2], Some(&2));
1819 assert_eq!(view[3], Some(&3));
1820 assert_eq!(view.len(), 4);
1821 }
1822
1823 #[test]
1824 fn peek_amount_from_start_bigger_than_input_len() {
1825 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1826 let view = peeking_queue.peek_amount(6);
1827
1828 assert_eq!(view[0], Some(&0));
1829 assert_eq!(view[1], Some(&1));
1830 assert_eq!(view[2], Some(&2));
1831 assert_eq!(view[3], Some(&3));
1832 assert_eq!(view[4], None);
1833 assert_eq!(view[5], None);
1834 assert_eq!(view.len(), 6);
1835 }
1836
1837 #[test]
1838 fn peek_amount_empty() {
1839 let empty: [u32; 0] = [];
1840 let mut peeking_queue = empty.iter().peekmore();
1841 let view = peeking_queue.peek_amount(3);
1842
1843 assert_eq!(view[0], None);
1844 assert_eq!(view[0], None);
1845 assert_eq!(view[0], None);
1846 assert_eq!(view.len(), 3);
1847 }
1848
1849 #[test]
1850 fn peek_amount_zero() {
1851 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1852 let view = peeking_queue.peek_amount(0);
1853
1854 assert_eq!(view.len(), 0);
1855 }
1856
1857 #[test]
1858 fn peek_amount_match() {
1859 let mut peeking_queue = ["call", "f", "1"].iter().peekmore();
1860 let view = peeking_queue.peek_amount(4);
1861
1862 let value = match view {
1863 [Some(&"call"), Some(&"f"), Some(arg), None] => arg,
1864 _ => panic!("test case peek_n_match failed"),
1865 };
1866
1867 assert_eq!(**value, "1");
1868 assert_eq!(view.len(), 4);
1869 }
1870
1871 #[test]
1872 fn peek_amount_renewed_view() {
1873 let mut peeking_queue = [0, 1, 2, 3].iter().peekmore();
1874 let view = peeking_queue.peek_amount(2);
1875
1876 assert_eq!(view[0], Some(&0));
1877 assert_eq!(view[1], Some(&1));
1878
1879 let _removed = peeking_queue.next();
1880
1881 let view = peeking_queue.peek_amount(2);
1882
1883 assert_eq!(view[0], Some(&1));
1884 assert_eq!(view[1], Some(&2));
1885 }
1886
1887 #[test]
1888 fn next_if_works() {
1889 let iterable = [1, 2, 3, 4];
1890
1891 let mut iter = iterable.iter().peekmore();
1892
1893 assert_eq!(iter.next_if(|&x| *x == 1), Some(&1));
1894
1895 assert_eq!(iter.peek(), Some(&&2));
1896 assert_eq!(iter.next_if(|&x| *x < 4), Some(&2));
1897 assert_eq!(iter.peek(), Some(&&3));
1898
1899 assert_eq!(iter.peek(), Some(&&3));
1900 assert_eq!(iter.next_if(|&x| *x != 3), None);
1901 assert_eq!(iter.peek(), Some(&&3));
1902
1903 assert_eq!(iter.next(), Some(&3));
1904 assert_eq!(iter.next_if(|&_x| true), Some(&4));
1905 }
1906
1907 #[test]
1908 fn next_if_exhausted() {
1909 let iterable = [1, 2];
1910
1911 let mut iter = iterable.iter().peekmore();
1912
1913 assert_eq!(iter.next_if(|&x| *x == 1), Some(&1));
1914 assert_eq!(iter.next_if(|&x| *x == 2), Some(&2));
1915
1916 assert_eq!(iter.next_if(|&x| *x == 2), None);
1917 }
1918
1919 #[test]
1920 fn next_if_loop() {
1921 let iterable = 1..15;
1922
1923 let mut iter = iterable.peekmore();
1924
1925 while iter.next_if(|&x| x < 10).is_some() {}
1926 assert_eq!(iter.next(), Some(10));
1927 }
1928
1929 #[test]
1930 fn next_if_with_advanced_cursor() {
1931 let iterable = [1, 2, 3, 4];
1932
1933 let mut iter = iterable.iter().peekmore();
1934
1935 assert_eq!(iter.peek(), Some(&&1));
1936 let iter = iter.advance_cursor();
1937 let iter = iter.advance_cursor();
1938 assert_eq!(iter.peek(), Some(&&3));
1939 assert_eq!(iter.next_if(|&x| *x == 1), Some(&1));
1940 assert_eq!(iter.peek(), Some(&&3));
1941 assert_eq!(iter.next_if(|&x| *x == 2), Some(&2));
1942 }
1943
1944 #[test]
1945 fn next_if_eq_works() {
1946 let iterable = [1, 2, 3, 4];
1947
1948 let mut iter = iterable.iter().peekmore();
1949
1950 assert_eq!(iter.next_if_eq(&&1), Some(&1));
1951
1952 assert_eq!(iter.peek(), Some(&&2));
1953 assert_eq!(iter.next_if_eq(&&2), Some(&2));
1954 assert_eq!(iter.peek(), Some(&&3));
1955
1956 assert_eq!(iter.peek(), Some(&&3));
1957 assert_eq!(iter.next_if_eq(&&0), None);
1958 assert_eq!(iter.peek(), Some(&&3));
1959
1960 assert_eq!(iter.next_if_eq(&&3), Some(&3));
1961 assert_eq!(iter.next_if_eq(&&4), Some(&4));
1962
1963 assert_eq!(iter.next_if_eq(&&5), None);
1964 }
1965}