@@ -17,11 +17,6 @@ pub enum List<T> {
17
17
Nil ,
18
18
}
19
19
20
- /// Create a list from a vector
21
- pub fn from_vec < T : Clone + ' static > ( v : & [ T ] ) -> @List < T > {
22
- v. rev_iter ( ) . fold ( @Nil :: < T > , |t, h| @Cons ( ( * h) . clone ( ) , t) )
23
- }
24
-
25
20
/**
26
21
* Left fold
27
22
*
@@ -133,6 +128,16 @@ pub fn append<T:Clone + 'static>(list: @List<T>, other: @List<T>) -> @List<T> {
133
128
}
134
129
}
135
130
131
+ impl < T : ' static + Clone > List < T > {
132
+ /// Create a list from a vector
133
+ pub fn from_vec ( v : & [ T ] ) -> List < T > {
134
+ match v. len ( ) {
135
+ 0 => Nil ,
136
+ _ => v. rev_iter ( ) . fold ( Nil , |tail, value : & T | Cons ( value. clone ( ) , @tail) )
137
+ }
138
+ }
139
+ }
140
+
136
141
/*
137
142
/// Push one element into the front of a list, returning a new list
138
143
/// THIS VERSION DOESN'T ACTUALLY WORK
@@ -171,16 +176,16 @@ pub fn each<T>(list: @List<T>, f: |&T| -> bool) -> bool {
171
176
172
177
#[ cfg( test) ]
173
178
mod tests {
174
- use list:: { List , Nil , from_vec , head, is_empty, tail} ;
179
+ use list:: { List , Nil , head, is_empty, tail} ;
175
180
use list;
176
181
177
182
use std:: option;
178
183
179
184
#[ test]
180
185
fn test_is_empty ( ) {
181
- let empty : @list:: List < int > = from_vec ( [ ] ) ;
182
- let full1 = from_vec ( [ 1 ] ) ;
183
- let full2 = from_vec ( [ 'r' , 'u' ] ) ;
186
+ let empty : @list:: List < int > = @ List :: from_vec ( [ ] ) ;
187
+ let full1 = @ List :: from_vec ( [ 1 ] ) ;
188
+ let full2 = @ List :: from_vec ( [ 'r' , 'u' ] ) ;
184
189
185
190
assert ! ( is_empty( empty) ) ;
186
191
assert ! ( !is_empty( full1) ) ;
@@ -189,7 +194,7 @@ mod tests {
189
194
190
195
#[ test]
191
196
fn test_from_vec ( ) {
192
- let list = from_vec ( [ 0 , 1 , 2 ] ) ;
197
+ let list = @ List :: from_vec ( [ 0 , 1 , 2 ] ) ;
193
198
194
199
assert_eq ! ( head( list) , 0 ) ;
195
200
@@ -202,14 +207,14 @@ mod tests {
202
207
203
208
#[ test]
204
209
fn test_from_vec_empty ( ) {
205
- let empty : @ list:: List < int > = from_vec ( [ ] ) ;
206
- assert_eq ! ( empty, @list :: Nil :: <int>) ;
210
+ let empty : list:: List < int > = List :: from_vec ( [ ] ) ;
211
+ assert_eq ! ( empty, Nil :: <int>) ;
207
212
}
208
213
209
214
#[ test]
210
215
fn test_foldl ( ) {
211
216
fn add ( a : & uint , b : & int ) -> uint { return * a + ( * b as uint ) ; }
212
- let list = from_vec ( [ 0 , 1 , 2 , 3 , 4 ] ) ;
217
+ let list = @ List :: from_vec ( [ 0 , 1 , 2 , 3 , 4 ] ) ;
213
218
let empty = @list:: Nil :: < int > ;
214
219
assert_eq ! ( list:: foldl( 0 u, list, add) , 10 u) ;
215
220
assert_eq ! ( list:: foldl( 0 u, empty, add) , 0 u) ;
@@ -220,21 +225,21 @@ mod tests {
220
225
fn sub ( a : & int , b : & int ) -> int {
221
226
* a - * b
222
227
}
223
- let list = from_vec ( [ 1 , 2 , 3 , 4 ] ) ;
228
+ let list = @ List :: from_vec ( [ 1 , 2 , 3 , 4 ] ) ;
224
229
assert_eq ! ( list:: foldl( 0 , list, sub) , -10 ) ;
225
230
}
226
231
227
232
#[ test]
228
233
fn test_find_success ( ) {
229
234
fn match_ ( i : & int ) -> bool { return * i == 2 ; }
230
- let list = from_vec ( [ 0 , 1 , 2 ] ) ;
235
+ let list = @ List :: from_vec ( [ 0 , 1 , 2 ] ) ;
231
236
assert_eq ! ( list:: find( list, match_) , option:: Some ( 2 ) ) ;
232
237
}
233
238
234
239
#[ test]
235
240
fn test_find_fail ( ) {
236
241
fn match_ ( _i : & int ) -> bool { return false ; }
237
- let list = from_vec ( [ 0 , 1 , 2 ] ) ;
242
+ let list = @ List :: from_vec ( [ 0 , 1 , 2 ] ) ;
238
243
let empty = @list:: Nil :: < int > ;
239
244
assert_eq ! ( list:: find( list, match_) , option:: None :: <int>) ;
240
245
assert_eq ! ( list:: find( empty, match_) , option:: None :: <int>) ;
@@ -243,15 +248,15 @@ mod tests {
243
248
#[ test]
244
249
fn test_any ( ) {
245
250
fn match_ ( i : & int ) -> bool { return * i == 2 ; }
246
- let list = from_vec ( [ 0 , 1 , 2 ] ) ;
251
+ let list = @ List :: from_vec ( [ 0 , 1 , 2 ] ) ;
247
252
let empty = @list:: Nil :: < int > ;
248
253
assert_eq ! ( list:: any( list, match_) , true ) ;
249
254
assert_eq ! ( list:: any( empty, match_) , false ) ;
250
255
}
251
256
252
257
#[ test]
253
258
fn test_has ( ) {
254
- let list = from_vec ( [ 5 , 8 , 6 ] ) ;
259
+ let list = @ List :: from_vec ( [ 5 , 8 , 6 ] ) ;
255
260
let empty = @list:: Nil :: < int > ;
256
261
assert ! ( ( list:: has( list, 5 ) ) ) ;
257
262
assert ! ( ( !list:: has( list, 7 ) ) ) ;
@@ -261,15 +266,15 @@ mod tests {
261
266
262
267
#[ test]
263
268
fn test_len ( ) {
264
- let list = from_vec ( [ 0 , 1 , 2 ] ) ;
269
+ let list = @ List :: from_vec ( [ 0 , 1 , 2 ] ) ;
265
270
let empty = @list:: Nil :: < int > ;
266
271
assert_eq ! ( list:: len( list) , 3 u) ;
267
272
assert_eq ! ( list:: len( empty) , 0 u) ;
268
273
}
269
274
270
275
#[ test]
271
276
fn test_append ( ) {
272
- assert ! ( from_vec( [ 1 , 2 , 3 , 4 ] )
273
- == list:: append( list :: from_vec( [ 1 , 2 ] ) , list :: from_vec( [ 3 , 4 ] ) ) ) ;
277
+ assert ! ( @ List :: from_vec( [ 1 , 2 , 3 , 4 ] )
278
+ == list:: append( @ List :: from_vec( [ 1 , 2 ] ) , @ List :: from_vec( [ 3 , 4 ] ) ) ) ;
274
279
}
275
280
}
0 commit comments