Add 5.timesi() |idx| { ... }

This commit is contained in:
Paul Stansifer 2012-07-20 15:33:18 -07:00
parent a57686d46d
commit 1c472564e3
4 changed files with 47 additions and 14 deletions

View File

@ -10,22 +10,22 @@ import str::{extensions, str_slice, unique_str};
import vec::extensions;
import vec::{const_vector, copyable_vector, immutable_vector};
import vec::{immutable_copyable_vector, iter_trait_extensions, vec_concat};
import iter::{base_iter, extended_iter, copyable_iter, times};
import iter::{base_iter, extended_iter, copyable_iter, times, timesi};
import option::extensions;
import option_iter::extensions;
import ptr::{extensions, ptr};
import rand::extensions;
import result::extensions;
import int::{num, times};
import i8::{num, times};
import i16::{num, times};
import i32::{num, times};
import i64::{num, times};
import uint::{num, times};
import u8::{num, times};
import u16::{num, times};
import u32::{num, times};
import u64::{num, times};
import int::{num, times, timesi};
import i8::{num, times, timesi};
import i16::{num, times, timesi};
import i32::{num, times, timesi};
import i64::{num, times, timesi};
import uint::{num, times, timesi};
import u8::{num, times, timesi};
import u16::{num, times, timesi};
import u32::{num, times, timesi};
import u64::{num, times, timesi};
import float::num;
import f32::num;
import f64::num;
@ -34,7 +34,7 @@ import num::num;
export path, option, some, none, unreachable;
export extensions;
// The following exports are the extension impls for numeric types
export num, times;
export num, times, timesi;
// The following exports are the common traits
export str_slice, unique_str;
export const_vector, copyable_vector, immutable_vector;

View File

@ -11,7 +11,7 @@ export range;
export compl;
export abs;
export parse_buf, from_str, to_str, to_str_bytes, str;
export num, ord, eq, times;
export num, ord, eq, times, timesi;
const min_value: T = -1 as T << (inst::bits - 1 as T);
const max_value: T = min_value - 1 as T;
@ -155,6 +155,23 @@ impl times of iter::times for T {
}
}
impl timesi of iter::timesi for T {
#[inline(always)]
/// Like `times`, but provides an index
fn timesi(it: fn(uint) -> bool) {
let slf = self as uint;
if slf < 0u {
fail #fmt("The .timesi method expects a nonnegative number, \
but found %?", self);
}
let mut i = 0u;
while i < slf {
if !it(i) { break }
i += 1u;
}
}
}
// FIXME: Has alignment issues on windows and 32-bit linux (#2609)
#[test]
#[ignore]

View File

@ -16,6 +16,9 @@ trait extended_iter<A> {
iface times {
fn times(it: fn() -> bool);
}
iface timesi{
fn timesi(it: fn(uint) -> bool);
}
trait copyable_iter<A:copy> {
fn filter_to_vec(pred: fn(A) -> bool) -> ~[A];

View File

@ -11,7 +11,7 @@ export range;
export compl;
export to_str, to_str_bytes;
export from_str, from_str_radix, str, parse_buf;
export num, ord, eq, times;
export num, ord, eq, times, timesi;
const min_value: T = 0 as T;
const max_value: T = 0 as T - 1 as T;
@ -120,6 +120,19 @@ impl times of iter::times for T {
}
}
impl timesi of iter::timesi for T {
#[inline(always)]
/// Like `times`, but with an index, `eachi`-style.
fn timesi(it: fn(uint) -> bool) {
let slf = self as uint;
let mut i = 0u;
while i < slf {
if !it(i) { break }
i += 1u;
}
}
}
/// Parse a string to an int
fn from_str(s: ~str) -> option<T> { parse_buf(str::bytes(s), 10u) }