@@ -16,7 +16,7 @@ pub use self::multi_product::*;
16
16
17
17
use crate :: size_hint:: { self , SizeHint } ;
18
18
use std:: fmt;
19
- use std:: iter:: { FromIterator , Fuse , FusedIterator } ;
19
+ use std:: iter:: { Enumerate , FromIterator , Fuse , FusedIterator } ;
20
20
use std:: marker:: PhantomData ;
21
21
22
22
/// An iterator adaptor that alternates elements from two iterators until both
@@ -1039,16 +1039,15 @@ where
1039
1039
#[ derive( Clone ) ]
1040
1040
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
1041
1041
pub struct Positions < I , F > {
1042
- iter : I ,
1042
+ iter : Enumerate < I > ,
1043
1043
f : F ,
1044
- count : usize ,
1045
1044
}
1046
1045
1047
1046
impl < I , F > fmt:: Debug for Positions < I , F >
1048
1047
where
1049
1048
I : fmt:: Debug ,
1050
1049
{
1051
- debug_fmt_fields ! ( Positions , iter, count ) ;
1050
+ debug_fmt_fields ! ( Positions , iter) ;
1052
1051
}
1053
1052
1054
1053
/// Create a new `Positions` iterator.
@@ -1057,7 +1056,8 @@ where
1057
1056
I : Iterator ,
1058
1057
F : FnMut ( I :: Item ) -> bool ,
1059
1058
{
1060
- Positions { iter, f, count : 0 }
1059
+ let iter = iter. enumerate ( ) ;
1060
+ Positions { iter, f }
1061
1061
}
1062
1062
1063
1063
impl < I , F > Iterator for Positions < I , F >
@@ -1068,14 +1068,10 @@ where
1068
1068
type Item = usize ;
1069
1069
1070
1070
fn next ( & mut self ) -> Option < Self :: Item > {
1071
- while let Some ( v) = self . iter . next ( ) {
1072
- let i = self . count ;
1073
- self . count = i + 1 ;
1074
- if ( self . f ) ( v) {
1075
- return Some ( i) ;
1076
- }
1077
- }
1078
- None
1071
+ let f = & mut self . f ;
1072
+ // TODO: once MSRV >= 1.62, use `then_some`.
1073
+ self . iter
1074
+ . find_map ( |( count, val) | if f ( val) { Some ( count) } else { None } )
1079
1075
}
1080
1076
1081
1077
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
@@ -1086,13 +1082,11 @@ where
1086
1082
where
1087
1083
G : FnMut ( B , Self :: Item ) -> B ,
1088
1084
{
1089
- let mut count = self . count ;
1090
1085
let mut f = self . f ;
1091
- self . iter . fold ( init, |mut acc, val| {
1086
+ self . iter . fold ( init, |mut acc, ( count , val) | {
1092
1087
if f ( val) {
1093
1088
acc = func ( acc, count) ;
1094
1089
}
1095
- count += 1 ;
1096
1090
acc
1097
1091
} )
1098
1092
}
@@ -1104,22 +1098,20 @@ where
1104
1098
F : FnMut ( I :: Item ) -> bool ,
1105
1099
{
1106
1100
fn next_back ( & mut self ) -> Option < Self :: Item > {
1107
- while let Some ( v ) = self . iter . next_back ( ) {
1108
- if ( self . f ) ( v ) {
1109
- return Some ( self . count + self . iter . len ( ) ) ;
1110
- }
1111
- }
1112
- None
1101
+ let f = & mut self . f ;
1102
+ // TODO: once MSRV >= 1.62, use `then_some`.
1103
+ self . iter
1104
+ . by_ref ( )
1105
+ . rev ( )
1106
+ . find_map ( | ( count , val ) | if f ( val ) { Some ( count ) } else { None } )
1113
1107
}
1114
1108
1115
1109
fn rfold < B , G > ( self , init : B , mut func : G ) -> B
1116
1110
where
1117
1111
G : FnMut ( B , Self :: Item ) -> B ,
1118
1112
{
1119
- let mut count = self . count + self . iter . len ( ) ;
1120
1113
let mut f = self . f ;
1121
- self . iter . rfold ( init, |mut acc, val| {
1122
- count -= 1 ;
1114
+ self . iter . rfold ( init, |mut acc, ( count, val) | {
1123
1115
if f ( val) {
1124
1116
acc = func ( acc, count) ;
1125
1117
}
0 commit comments