about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorPaul Stansifer <paul.stansifer@gmail.com>2012-07-20 15:33:18 -0700
committerPaul Stansifer <paul.stansifer@gmail.com>2012-07-24 11:44:58 -0700
commit1c472564e37567dda820062cfd117115113b9def (patch)
tree06f475b12e937ab09febd74a27361da02ec8b87d /src/libcore
parenta57686d46d1fbdb3a8c6aec6761ff4791e6a9526 (diff)
Add `5.timesi() |idx| { ... }`
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/core.rs24
-rw-r--r--src/libcore/int-template.rs19
-rw-r--r--src/libcore/iter.rs3
-rw-r--r--src/libcore/uint-template.rs15
4 files changed, 47 insertions, 14 deletions
diff --git a/src/libcore/core.rs b/src/libcore/core.rs
index 4c175490b41..4738574fdb4 100644
--- a/src/libcore/core.rs
+++ b/src/libcore/core.rs
@@ -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;
diff --git a/src/libcore/int-template.rs b/src/libcore/int-template.rs
index d9fb3dae846..9986b22669d 100644
--- a/src/libcore/int-template.rs
+++ b/src/libcore/int-template.rs
@@ -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]
diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs
index 2e0c778cd5a..e4e57b7ec78 100644
--- a/src/libcore/iter.rs
+++ b/src/libcore/iter.rs
@@ -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];
diff --git a/src/libcore/uint-template.rs b/src/libcore/uint-template.rs
index 4f35f1a8756..e3b4f08ddaa 100644
--- a/src/libcore/uint-template.rs
+++ b/src/libcore/uint-template.rs
@@ -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) }