@@ -7,48 +7,49 @@ The iteration traits and common implementation
7
7
use cmp:: { Eq , Ord } ;
8
8
9
9
/// A function used to initialize the elements of a sequence
10
- type InitOp < T > = & fn ( uint ) -> T ;
10
+ pub type InitOp < T > = & fn ( uint ) -> T ;
11
11
12
- trait BaseIter < A > {
12
+ pub trait BaseIter < A > {
13
13
pure fn each ( blk : fn ( v : & A ) -> bool ) ;
14
14
pure fn size_hint ( ) -> Option < uint > ;
15
15
}
16
16
17
- trait ExtendedIter < A > {
17
+ pub trait ExtendedIter < A > {
18
18
pure fn eachi ( blk : fn ( uint , v : & A ) -> bool ) ;
19
19
pure fn all ( blk : fn ( & A ) -> bool ) -> bool ;
20
20
pure fn any ( blk : fn ( & A ) -> bool ) -> bool ;
21
21
pure fn foldl < B > ( +b0 : B , blk : fn ( & B , & A ) -> B ) -> B ;
22
22
pure fn position ( f : fn ( & A ) -> bool ) -> Option < uint > ;
23
23
}
24
24
25
- trait EqIter < A : Eq > {
25
+ pub trait EqIter < A : Eq > {
26
26
pure fn contains ( x : & A ) -> bool ;
27
27
pure fn count ( x : & A ) -> uint ;
28
28
}
29
29
30
- trait Times {
30
+ pub trait Times {
31
31
pure fn times ( it : fn ( ) -> bool ) ;
32
32
}
33
- trait TimesIx {
33
+
34
+ pub trait TimesIx {
34
35
pure fn timesi ( it : fn ( uint ) -> bool ) ;
35
36
}
36
37
37
- trait CopyableIter < A : Copy > {
38
+ pub trait CopyableIter < A : Copy > {
38
39
pure fn filter_to_vec ( pred : fn ( +a : A ) -> bool ) -> ~[ A ] ;
39
40
pure fn map_to_vec < B > ( op : fn ( +v : A ) -> B ) -> ~[ B ] ;
40
41
pure fn to_vec ( ) -> ~[ A ] ;
41
42
pure fn find ( p : fn ( +a : A ) -> bool ) -> Option < A > ;
42
43
}
43
44
44
- trait CopyableOrderedIter < A : Copy Ord > {
45
+ pub trait CopyableOrderedIter < A : Copy Ord > {
45
46
pure fn min ( ) -> A ;
46
47
pure fn max ( ) -> A ;
47
48
}
48
49
49
50
// A trait for sequences that can be by imperatively pushing elements
50
51
// onto them.
51
- trait Buildable < A > {
52
+ pub trait Buildable < A > {
52
53
/**
53
54
* Builds a buildable sequence by calling a provided function with
54
55
* an argument function that pushes an element onto the back of
@@ -66,38 +67,42 @@ trait Buildable<A> {
66
67
builder : fn ( push : pure fn( +v : A ) ) ) -> self ;
67
68
}
68
69
69
- pure fn eachi < A , IA : BaseIter < A > > ( self : & IA , blk : fn ( uint , v : & A ) -> bool ) {
70
+ pub pure fn eachi < A , IA : BaseIter < A > > ( self : & IA ,
71
+ blk : fn ( uint , v : & A ) -> bool ) {
70
72
let mut i = 0 ;
71
73
for self . each |a| {
72
74
if !blk( i, a) { break ; }
73
75
i += 1 ;
74
76
}
75
77
}
76
78
77
- pure fn all<A , IA : BaseIter < A > >( self : & IA , blk : fn ( & A ) -> bool ) -> bool {
79
+ pub pure fn all<A , IA : BaseIter < A > >( self : & IA ,
80
+ blk : fn ( & A ) -> bool ) -> bool {
78
81
for self. each |a | {
79
82
if !blk ( a ) { return false; }
80
83
}
81
84
return true ;
82
85
}
83
86
84
- pure fn any<A , IA : BaseIter <A >>( self : & IA , blk : fn ( & A ) -> bool) -> bool {
87
+ pub pure fn any < A , IA : BaseIter < A > > ( self : & IA ,
88
+ blk : fn ( & A ) -> bool ) -> bool {
85
89
for self . each |a| {
86
90
if blk ( a) { return true ; }
87
91
}
88
92
return false ;
89
93
}
90
94
91
- pure fn filter_to_vec < A : Copy , IA : BaseIter < A > > ( self : & IA ,
92
- prd : fn ( +a : A ) -> bool ) -> ~[ A ] {
95
+ pub pure fn filter_to_vec < A : Copy , IA : BaseIter < A > > (
96
+ self : & IA , prd : fn ( +a : A ) -> bool ) -> ~[ A ] {
93
97
do vec:: build_sized_opt ( self . size_hint ( ) ) |push| {
94
98
for self . each |a| {
95
99
if prd ( * a) { push ( * a) ; }
96
100
}
97
101
}
98
102
}
99
103
100
- pure fn map_to_vec < A : Copy , B , IA : BaseIter < A > > ( self : & IA , op : fn ( +v : A ) -> B )
104
+ pub pure fn map_to_vec < A : Copy , B , IA : BaseIter < A > > ( self : & IA ,
105
+ op : fn ( +v : A ) -> B )
101
106
-> ~[ B ] {
102
107
do vec:: build_sized_opt ( self . size_hint ( ) ) |push| {
103
108
for self . each |a| {
@@ -106,7 +111,7 @@ pure fn map_to_vec<A:Copy,B,IA:BaseIter<A>>(self: &IA, op: fn(+v: A) -> B)
106
111
}
107
112
}
108
113
109
- pure fn flat_map_to_vec < A : Copy , B : Copy , IA : BaseIter < A > , IB : BaseIter < B > > (
114
+ pub pure fn flat_map_to_vec < A : Copy , B : Copy , IA : BaseIter < A > , IB : BaseIter < B > > (
110
115
self : & IA , op : fn ( +a : A ) -> IB ) -> ~[ B ] {
111
116
112
117
do vec:: build |push| {
@@ -118,7 +123,8 @@ pure fn flat_map_to_vec<A:Copy,B:Copy,IA:BaseIter<A>,IB:BaseIter<B>>(
118
123
}
119
124
}
120
125
121
- pure fn foldl < A , B , IA : BaseIter < A > > ( self : & IA , +b0 : B , blk : fn ( & B , & A ) -> B )
126
+ pub pure fn foldl < A , B , IA : BaseIter < A > > ( self : & IA , +b0 : B ,
127
+ blk : fn ( & B , & A ) -> B )
122
128
-> B {
123
129
let mut b <- b0;
124
130
for self . each |a| {
@@ -127,18 +133,18 @@ pure fn foldl<A,B,IA:BaseIter<A>>(self: &IA, +b0: B, blk: fn(&B, &A) -> B)
127
133
move b
128
134
}
129
135
130
- pure fn to_vec < A : Copy , IA : BaseIter < A > > ( self : & IA ) -> ~[ A ] {
136
+ pub pure fn to_vec < A : Copy , IA : BaseIter < A > > ( self : & IA ) -> ~[ A ] {
131
137
foldl :: < A , ~[ A ] , IA > ( self , ~[ ] , |r, a| vec:: append ( copy ( * r) , ~[ * a] ) )
132
138
}
133
139
134
- pure fn contains < A : Eq , IA : BaseIter < A > > ( self : & IA , x : & A ) -> bool {
140
+ pub pure fn contains < A : Eq , IA : BaseIter < A > > ( self : & IA , x : & A ) -> bool {
135
141
for self . each |a| {
136
142
if * a == * x { return true ; }
137
143
}
138
144
return false ;
139
145
}
140
146
141
- pure fn count < A : Eq , IA : BaseIter < A > > ( self : & IA , x : & A ) -> uint {
147
+ pub pure fn count < A : Eq , IA : BaseIter < A > > ( self : & IA , x : & A ) -> uint {
142
148
do foldl ( self , 0 ) |count, value| {
143
149
if * value == * x {
144
150
* count + 1
@@ -148,7 +154,7 @@ pure fn count<A:Eq,IA:BaseIter<A>>(self: &IA, x: &A) -> uint {
148
154
}
149
155
}
150
156
151
- pure fn position < A , IA : BaseIter < A > > ( self : & IA , f : fn ( & A ) -> bool )
157
+ pub pure fn position < A , IA : BaseIter < A > > ( self : & IA , f : fn ( & A ) -> bool )
152
158
-> Option < uint >
153
159
{
154
160
let mut i = 0 ;
@@ -163,15 +169,15 @@ pure fn position<A,IA:BaseIter<A>>(self: &IA, f: fn(&A) -> bool)
163
169
// iter interface, such as would provide "reach" in addition to "each". as is,
164
170
// it would have to be implemented with foldr, which is too inefficient.
165
171
166
- pure fn repeat ( times : uint , blk : fn ( ) -> bool ) {
172
+ pub pure fn repeat ( times : uint , blk : fn ( ) -> bool ) {
167
173
let mut i = 0 ;
168
174
while i < times {
169
175
if !blk ( ) { break }
170
176
i += 1 ;
171
177
}
172
178
}
173
179
174
- pure fn min < A : Copy Ord , IA : BaseIter < A > > ( self : & IA ) -> A {
180
+ pub pure fn min < A : Copy Ord , IA : BaseIter < A > > ( self : & IA ) -> A {
175
181
match do foldl :: < A , Option < A > , IA > ( self , None ) |a, b| {
176
182
match a {
177
183
& Some ( ref a_) if * a_ < * b => {
@@ -185,7 +191,7 @@ pure fn min<A:Copy Ord,IA:BaseIter<A>>(self: &IA) -> A {
185
191
}
186
192
}
187
193
188
- pure fn max < A : Copy Ord , IA : BaseIter < A > > ( self : & IA ) -> A {
194
+ pub pure fn max < A : Copy Ord , IA : BaseIter < A > > ( self : & IA ) -> A {
189
195
match do foldl :: < A , Option < A > , IA > ( self , None ) |a, b| {
190
196
match a {
191
197
& Some ( ref a_) if * a_ > * b => {
@@ -199,7 +205,7 @@ pure fn max<A:Copy Ord,IA:BaseIter<A>>(self: &IA) -> A {
199
205
}
200
206
}
201
207
202
- pure fn find < A : Copy , IA : BaseIter < A > > ( self : & IA ,
208
+ pub pure fn find < A : Copy , IA : BaseIter < A > > ( self : & IA ,
203
209
p : fn ( +a : A ) -> bool ) -> Option < A > {
204
210
for self . each |i| {
205
211
if p ( * i) { return Some ( * i) }
@@ -220,7 +226,8 @@ pure fn find<A: Copy,IA:BaseIter<A>>(self: &IA,
220
226
* onto the sequence being constructed.
221
227
*/
222
228
#[ inline( always) ]
223
- pure fn build < A , B : Buildable < A > > ( builder : fn ( push : pure fn( +v : A ) ) ) -> B {
229
+ pub pure fn build < A , B : Buildable < A > > ( builder : fn ( push : pure fn( +v : A ) ) )
230
+ -> B {
224
231
build_sized ( 4 , builder)
225
232
}
226
233
@@ -238,7 +245,7 @@ pure fn build<A,B: Buildable<A>>(builder: fn(push: pure fn(+v: A))) -> B {
238
245
* onto the sequence being constructed.
239
246
*/
240
247
#[ inline( always) ]
241
- pure fn build_sized_opt < A , B : Buildable < A > > (
248
+ pub pure fn build_sized_opt < A , B : Buildable < A > > (
242
249
size : Option < uint > ,
243
250
builder : fn ( push : pure fn( +v : A ) ) ) -> B {
244
251
@@ -248,7 +255,8 @@ pure fn build_sized_opt<A,B: Buildable<A>>(
248
255
// Functions that combine iteration and building
249
256
250
257
/// Apply a function to each element of an iterable and return the results
251
- fn map < T , IT : BaseIter < T > , U , BU : Buildable < U > > ( v : & IT , f : fn ( & T ) -> U ) -> BU {
258
+ pub fn map < T , IT : BaseIter < T > , U , BU : Buildable < U > > ( v : & IT , f : fn ( & T ) -> U )
259
+ -> BU {
252
260
do build_sized_opt ( v. size_hint ( ) ) |push| {
253
261
for v. each( ) |elem| {
254
262
push( f( elem) ) ;
@@ -262,7 +270,8 @@ fn map<T,IT: BaseIter<T>,U,BU: Buildable<U>>(v: &IT, f: fn(&T) -> U) -> BU {
262
270
* Creates a generic sequence of size `n_elts` and initializes the elements
263
271
* to the value returned by the function `op`.
264
272
*/
265
- pure fn from_fn < T , BT : Buildable < T > > ( n_elts : uint , op : InitOp < T > ) -> BT {
273
+ pub pure fn from_fn < T , BT : Buildable < T > > ( n_elts : uint ,
274
+ op : InitOp < T > ) -> BT {
266
275
do build_sized ( n_elts) |push| {
267
276
let mut i: uint = 0 u;
268
277
while i < n_elts { push ( op ( i) ) ; i += 1 u; }
@@ -275,7 +284,8 @@ pure fn from_fn<T,BT: Buildable<T>>(n_elts: uint, op: InitOp<T>) -> BT {
275
284
* Creates an immutable vector of size `n_elts` and initializes the elements
276
285
* to the value `t`.
277
286
*/
278
- pure fn from_elem < T : Copy , BT : Buildable < T > > ( n_elts : uint , +t : T ) -> BT {
287
+ pub pure fn from_elem < T : Copy , BT : Buildable < T > > ( n_elts : uint ,
288
+ +t : T ) -> BT {
279
289
do build_sized ( n_elts) |push| {
280
290
let mut i: uint = 0 ;
281
291
while i < n_elts { push ( t) ; i += 1 ; }
@@ -284,7 +294,7 @@ pure fn from_elem<T: Copy,BT: Buildable<T>>(n_elts: uint, +t: T) -> BT {
284
294
285
295
/// Appending two generic sequences
286
296
#[ inline( always) ]
287
- pure fn append < T : Copy , IT : BaseIter < T > , BT : Buildable < T > > (
297
+ pub pure fn append < T : Copy , IT : BaseIter < T > , BT : Buildable < T > > (
288
298
lhs : & IT , rhs : & IT ) -> BT {
289
299
let size_opt = lhs. size_hint ( ) . chain_ref (
290
300
|sz1| rhs. size_hint ( ) . map ( |sz2| * sz1+* sz2) ) ;
@@ -297,7 +307,7 @@ pure fn append<T: Copy,IT: BaseIter<T>,BT: Buildable<T>>(
297
307
/// Copies a generic sequence, possibly converting it to a different
298
308
/// type of sequence.
299
309
#[ inline( always) ]
300
- pure fn copy_seq < T : Copy , IT : BaseIter < T > , BT : Buildable < T > > (
310
+ pub pure fn copy_seq < T : Copy , IT : BaseIter < T > , BT : Buildable < T > > (
301
311
v : & IT ) -> BT {
302
312
do build_sized_opt ( v. size_hint ( ) ) |push| {
303
313
for v. each |x| { push ( * x) ; }
0 commit comments