@@ -1522,6 +1522,52 @@ impl<A: Sub<A, A> + Integer + Ord + Clone> DoubleEndedIterator<A> for Range<A> {
1522
1522
}
1523
1523
}
1524
1524
1525
+ /// A range of numbers from [0, N]
1526
+ #[ deriving( Clone , DeepClone ) ]
1527
+ pub struct RangeInclusive < A > {
1528
+ priv range : Range < A > ,
1529
+ priv done : bool
1530
+ }
1531
+
1532
+ /// Return an iterator over the range [start, stop]
1533
+ #[ inline]
1534
+ pub fn range_inclusive < A : Add < A , A > + Ord + Clone + One > ( start : A , stop : A ) -> RangeInclusive < A > {
1535
+ RangeInclusive { range : range ( start, stop) , done : false }
1536
+ }
1537
+
1538
+ impl < A : Add < A , A > + Ord + Clone > Iterator < A > for RangeInclusive < A > {
1539
+ #[ inline]
1540
+ fn next ( & mut self ) -> Option < A > {
1541
+ match self . range . next ( ) {
1542
+ Some ( x) => Some ( x) ,
1543
+ None => {
1544
+ if self . done {
1545
+ None
1546
+ } else {
1547
+ self . done = true ;
1548
+ Some ( self . range . stop . clone ( ) )
1549
+ }
1550
+ }
1551
+ }
1552
+ }
1553
+ }
1554
+
1555
+ impl < A : Sub < A , A > + Integer + Ord + Clone > DoubleEndedIterator < A > for RangeInclusive < A > {
1556
+ #[ inline]
1557
+ fn next_back ( & mut self ) -> Option < A > {
1558
+ if self . range . stop > self . range . state {
1559
+ let result = self . range . stop . clone ( ) ;
1560
+ self . range . stop = self . range . stop - self . range . one ;
1561
+ Some ( result)
1562
+ } else if self . done {
1563
+ None
1564
+ } else {
1565
+ self . done = true ;
1566
+ Some ( self . range . stop . clone ( ) )
1567
+ }
1568
+ }
1569
+ }
1570
+
1525
1571
impl < A : Add < A , A > + Clone > Iterator < A > for Counter < A > {
1526
1572
#[ inline]
1527
1573
fn next ( & mut self ) -> Option < A > {
@@ -2286,4 +2332,10 @@ mod tests {
2286
2332
fail ! ( "unreachable" ) ;
2287
2333
}
2288
2334
}
2335
+
2336
+ #[ test]
2337
+ fn test_range_inclusive ( ) {
2338
+ assert_eq ! ( range_inclusive( 0 i, 5 ) . collect:: <~[ int] >( ) , ~[ 0 i, 1 , 2 , 3 , 4 , 5 ] ) ;
2339
+ assert_eq ! ( range_inclusive( 0 i, 5 ) . invert( ) . collect:: <~[ int] >( ) , ~[ 5 i, 4 , 3 , 2 , 1 , 0 ] ) ;
2340
+ }
2289
2341
}
0 commit comments