@@ -4,7 +4,8 @@ use crate::mem;
44use crate :: ops:: { self , Try } ;
55
66use super :: {
7- FusedIterator , TrustedLen , TrustedRandomAccess , TrustedRandomAccessNoCoerce , TrustedStep ,
7+ FusedIterator , PeekableIterator , TrustedLen , TrustedRandomAccess , TrustedRandomAccessNoCoerce ,
8+ TrustedStep ,
89} ;
910
1011// Safety: All invariants are upheld.
@@ -765,6 +766,13 @@ impl<A: Step> Iterator for ops::Range<A> {
765766 }
766767}
767768
769+ #[ unstable( feature = "peekable_iterator" , issue = "none" ) ]
770+ impl < A : Step > PeekableIterator for ops:: Range < A > {
771+ fn peek ( & self ) -> Option < A > {
772+ if self . start < self . end { Some ( self . start . clone ( ) ) } else { None }
773+ }
774+ }
775+
768776// These macros generate `ExactSizeIterator` impls for various range types.
769777//
770778// * `ExactSizeIterator::len` is required to always return an exact `usize`,
@@ -879,6 +887,13 @@ impl<A: Step> Iterator for ops::RangeFrom<A> {
879887 }
880888}
881889
890+ #[ unstable( feature = "peekable_iterator" , issue = "none" ) ]
891+ impl < A : Step > PeekableIterator for ops:: RangeFrom < A > {
892+ fn peek ( & self ) -> Option < A > {
893+ Some ( self . start . clone ( ) )
894+ }
895+ }
896+
882897// Safety: See above implementation for `ops::Range<A>`
883898#[ unstable( feature = "trusted_len" , issue = "37572" ) ]
884899unsafe impl < A : TrustedStep > TrustedLen for ops:: RangeFrom < A > { }
@@ -1186,6 +1201,13 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
11861201 }
11871202}
11881203
1204+ #[ unstable( feature = "peekable_iterator" , issue = "none" ) ]
1205+ impl < A : Step > PeekableIterator for ops:: RangeInclusive < A > {
1206+ fn peek ( & self ) -> Option < A > {
1207+ if self . is_empty ( ) { None } else { Some ( self . start . clone ( ) ) }
1208+ }
1209+ }
1210+
11891211#[ stable( feature = "inclusive_range" , since = "1.26.0" ) ]
11901212impl < A : Step > DoubleEndedIterator for ops:: RangeInclusive < A > {
11911213 #[ inline]
0 commit comments