Skip to content

Commit 0d72f60

Browse files
committed
iterator: add a range_inclusive function
Closes #6242
1 parent 2bc999a commit 0d72f60

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

src/libstd/iterator.rs

+52
Original file line numberDiff line numberDiff line change
@@ -1522,6 +1522,52 @@ impl<A: Sub<A, A> + Integer + Ord + Clone> DoubleEndedIterator<A> for Range<A> {
15221522
}
15231523
}
15241524

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+
15251571
impl<A: Add<A, A> + Clone> Iterator<A> for Counter<A> {
15261572
#[inline]
15271573
fn next(&mut self) -> Option<A> {
@@ -2286,4 +2332,10 @@ mod tests {
22862332
fail!("unreachable");
22872333
}
22882334
}
2335+
2336+
#[test]
2337+
fn test_range_inclusive() {
2338+
assert_eq!(range_inclusive(0i, 5).collect::<~[int]>(), ~[0i, 1, 2, 3, 4, 5]);
2339+
assert_eq!(range_inclusive(0i, 5).invert().collect::<~[int]>(), ~[5i, 4, 3, 2, 1, 0]);
2340+
}
22892341
}

0 commit comments

Comments
 (0)