10
10
11
11
//! A standard, garbage-collected linked list.
12
12
13
-
14
-
15
13
#[ deriving( Clone , Eq ) ]
16
14
#[ allow( missing_doc) ]
17
15
pub enum List < T > {
@@ -33,30 +31,30 @@ pub fn from_vec<T:Clone + 'static>(v: &[T]) -> @List<T> {
33
31
*
34
32
* # Arguments
35
33
*
36
- * * ls - The list to fold
34
+ * * list - The list to fold
37
35
* * z - The initial value
38
36
* * f - The function to apply
39
37
*/
40
- pub fn foldl < T : Clone , U > ( z : T , ls : @List < U > , f : |& T , & U | -> T ) -> T {
38
+ pub fn foldl < T : Clone , U > ( z : T , list : @List < U > , f : |& T , & U | -> T ) -> T {
41
39
let mut accum: T = z;
42
- iter ( ls , |elt | accum = f ( & accum, elt ) ) ;
40
+ iter ( list , |element | accum = f ( & accum, element ) ) ;
43
41
accum
44
42
}
45
43
46
44
/**
47
45
* Search for an element that matches a given predicate
48
46
*
49
- * Apply function `f` to each element of `ls `, starting from the first.
47
+ * Apply function `f` to each element of `list `, starting from the first.
50
48
* When function `f` returns true then an option containing the element
51
49
* is returned. If `f` matches no elements then none is returned.
52
50
*/
53
- pub fn find < T : Clone > ( ls : @List < T > , f: |& T | -> bool) -> Option < T > {
54
- let mut ls = ls ;
51
+ pub fn find < T : Clone > ( list : @List < T > , f: |& T | -> bool) -> Option < T > {
52
+ let mut list = list ;
55
53
loop {
56
- ls = match * ls {
57
- Cons ( ref hd , tl ) => {
58
- if f ( hd ) { return Some ( ( * hd ) . clone ( ) ) ; }
59
- tl
54
+ list = match * list {
55
+ Cons ( ref head , tail ) => {
56
+ if f ( head ) { return Some ( ( * head ) . clone ( ) ) ; }
57
+ tail
60
58
}
61
59
Nil => return None
62
60
}
@@ -66,71 +64,71 @@ pub fn find<T:Clone>(ls: @List<T>, f: |&T| -> bool) -> Option<T> {
66
64
/**
67
65
* Returns true if a list contains an element that matches a given predicate
68
66
*
69
- * Apply function `f` to each element of `ls `, starting from the first.
67
+ * Apply function `f` to each element of `list `, starting from the first.
70
68
* When function `f` returns true then it also returns true. If `f` matches no
71
69
* elements then false is returned.
72
70
*/
73
- pub fn any < T > ( ls : @List < T > , f: |& T | -> bool) -> bool {
74
- let mut ls = ls ;
71
+ pub fn any < T > ( list : @List < T > , f: |& T | -> bool) -> bool {
72
+ let mut list = list ;
75
73
loop {
76
- ls = match * ls {
77
- Cons ( ref hd , tl ) => {
78
- if f ( hd ) { return true ; }
79
- tl
74
+ list = match * list {
75
+ Cons ( ref head , tail ) => {
76
+ if f ( head ) { return true ; }
77
+ tail
80
78
}
81
79
Nil => return false
82
80
}
83
81
} ;
84
82
}
85
83
86
84
/// Returns true if a list contains an element with the given value
87
- pub fn has < T : Eq > ( ls : @List < T > , elt : T ) -> bool {
85
+ pub fn has < T : Eq > ( list : @List < T > , element : T ) -> bool {
88
86
let mut found = false ;
89
- each ( ls , |e| {
90
- if * e == elt { found = true ; false } else { true }
87
+ each ( list , |e| {
88
+ if * e == element { found = true ; false } else { true }
91
89
} ) ;
92
90
return found;
93
91
}
94
92
95
93
/// Returns true if the list is empty
96
- pub fn is_empty < T > ( ls : @List < T > ) -> bool {
97
- match * ls {
94
+ pub fn is_empty < T > ( list : @List < T > ) -> bool {
95
+ match * list {
98
96
Nil => true ,
99
97
_ => false
100
98
}
101
99
}
102
100
103
101
/// Returns the length of a list
104
- pub fn len < T > ( ls : @List < T > ) -> uint {
102
+ pub fn len < T > ( list : @List < T > ) -> uint {
105
103
let mut count = 0 u;
106
- iter ( ls , |_e| count += 1 u) ;
104
+ iter ( list , |_e| count += 1 u) ;
107
105
count
108
106
}
109
107
110
108
/// Returns all but the first element of a list
111
- pub fn tail < T > ( ls : @List < T > ) -> @List < T > {
112
- match * ls {
113
- Cons ( _, tl ) => return tl ,
109
+ pub fn tail < T > ( list : @List < T > ) -> @List < T > {
110
+ match * list {
111
+ Cons ( _, tail ) => return tail ,
114
112
Nil => fail ! ( "list empty" )
115
113
}
116
114
}
117
115
118
116
/// Returns the first element of a list
119
- pub fn head < T : Clone > ( ls : @List < T > ) -> T {
120
- match * ls {
121
- Cons ( ref hd , _) => ( * hd ) . clone ( ) ,
117
+ pub fn head < T : Clone > ( list : @List < T > ) -> T {
118
+ match * list {
119
+ Cons ( ref head , _) => ( * head ) . clone ( ) ,
122
120
// makes me sad
123
121
_ => fail ! ( "head invoked on empty list" )
124
122
}
125
123
}
126
124
127
125
/// Appends one list to another
128
- pub fn append < T : Clone + ' static > ( l : @List < T > , m : @List < T > ) -> @List < T > {
129
- match * l {
130
- Nil => return m ,
131
- Cons ( ref x , xs ) => {
132
- let rest = append ( xs , m ) ;
133
- return @Cons ( ( * x ) . clone ( ) , rest) ;
126
+ pub fn append < T : Clone + ' static > ( list : @List < T > , other : @List < T > ) -> @List < T > {
127
+ match * list {
128
+ Nil => return other ,
129
+ Cons ( ref head , tail ) => {
130
+ let rest = append ( tail , other ) ;
131
+ return @Cons ( ( * head ) . clone ( ) , rest) ;
134
132
}
135
133
}
136
134
}
@@ -144,27 +142,27 @@ fn push<T:Clone>(ll: &mut @list<T>, vv: T) {
144
142
*/
145
143
146
144
/// Iterate over a list
147
- pub fn iter < T > ( l : @List < T > , f: |& T |) {
148
- let mut cur = l ;
145
+ pub fn iter < T > ( list : @List < T > , f: |& T |) {
146
+ let mut cur = list ;
149
147
loop {
150
148
cur = match * cur {
151
- Cons ( ref hd , tl ) => {
152
- f ( hd ) ;
153
- tl
149
+ Cons ( ref head , tail ) => {
150
+ f ( head ) ;
151
+ tail
154
152
}
155
153
Nil => break
156
154
}
157
155
}
158
156
}
159
157
160
158
/// Iterate over a list
161
- pub fn each < T > ( l : @List < T > , f: |& T | -> bool) -> bool {
162
- let mut cur = l ;
159
+ pub fn each < T > ( list : @List < T > , f: |& T | -> bool) -> bool {
160
+ let mut cur = list ;
163
161
loop {
164
162
cur = match * cur {
165
- Cons ( ref hd , tl ) => {
166
- if !f ( hd ) { return false ; }
167
- tl
163
+ Cons ( ref head , tail ) => {
164
+ if !f ( head ) { return false ; }
165
+ tail
168
166
}
169
167
Nil => { return true ; }
170
168
}
@@ -191,11 +189,11 @@ mod tests {
191
189
192
190
#[ test]
193
191
fn test_from_vec ( ) {
194
- let l = from_vec ( [ 0 , 1 , 2 ] ) ;
192
+ let list = from_vec ( [ 0 , 1 , 2 ] ) ;
195
193
196
- assert_eq ! ( head( l ) , 0 ) ;
194
+ assert_eq ! ( head( list ) , 0 ) ;
197
195
198
- let tail_l = tail ( l ) ;
196
+ let tail_l = tail ( list ) ;
199
197
assert_eq ! ( head( tail_l) , 1 ) ;
200
198
201
199
let tail_tail_l = tail ( tail_l) ;
@@ -211,9 +209,9 @@ mod tests {
211
209
#[ test]
212
210
fn test_foldl ( ) {
213
211
fn add ( a : & uint , b : & int ) -> uint { return * a + ( * b as uint ) ; }
214
- let l = from_vec ( [ 0 , 1 , 2 , 3 , 4 ] ) ;
212
+ let list = from_vec ( [ 0 , 1 , 2 , 3 , 4 ] ) ;
215
213
let empty = @list:: Nil :: < int > ;
216
- assert_eq ! ( list:: foldl( 0 u, l , add) , 10 u) ;
214
+ assert_eq ! ( list:: foldl( 0 u, list , add) , 10 u) ;
217
215
assert_eq ! ( list:: foldl( 0 u, empty, add) , 0 u) ;
218
216
}
219
217
@@ -222,50 +220,50 @@ mod tests {
222
220
fn sub ( a : & int , b : & int ) -> int {
223
221
* a - * b
224
222
}
225
- let l = from_vec ( [ 1 , 2 , 3 , 4 ] ) ;
226
- assert_eq ! ( list:: foldl( 0 , l , sub) , -10 ) ;
223
+ let list = from_vec ( [ 1 , 2 , 3 , 4 ] ) ;
224
+ assert_eq ! ( list:: foldl( 0 , list , sub) , -10 ) ;
227
225
}
228
226
229
227
#[ test]
230
228
fn test_find_success ( ) {
231
229
fn match_ ( i : & int ) -> bool { return * i == 2 ; }
232
- let l = from_vec ( [ 0 , 1 , 2 ] ) ;
233
- assert_eq ! ( list:: find( l , match_) , option:: Some ( 2 ) ) ;
230
+ let list = from_vec ( [ 0 , 1 , 2 ] ) ;
231
+ assert_eq ! ( list:: find( list , match_) , option:: Some ( 2 ) ) ;
234
232
}
235
233
236
234
#[ test]
237
235
fn test_find_fail ( ) {
238
236
fn match_ ( _i : & int ) -> bool { return false ; }
239
- let l = from_vec ( [ 0 , 1 , 2 ] ) ;
237
+ let list = from_vec ( [ 0 , 1 , 2 ] ) ;
240
238
let empty = @list:: Nil :: < int > ;
241
- assert_eq ! ( list:: find( l , match_) , option:: None :: <int>) ;
239
+ assert_eq ! ( list:: find( list , match_) , option:: None :: <int>) ;
242
240
assert_eq ! ( list:: find( empty, match_) , option:: None :: <int>) ;
243
241
}
244
242
245
243
#[ test]
246
244
fn test_any ( ) {
247
245
fn match_ ( i : & int ) -> bool { return * i == 2 ; }
248
- let l = from_vec ( [ 0 , 1 , 2 ] ) ;
246
+ let list = from_vec ( [ 0 , 1 , 2 ] ) ;
249
247
let empty = @list:: Nil :: < int > ;
250
- assert_eq ! ( list:: any( l , match_) , true ) ;
248
+ assert_eq ! ( list:: any( list , match_) , true ) ;
251
249
assert_eq ! ( list:: any( empty, match_) , false ) ;
252
250
}
253
251
254
252
#[ test]
255
253
fn test_has ( ) {
256
- let l = from_vec ( [ 5 , 8 , 6 ] ) ;
254
+ let list = from_vec ( [ 5 , 8 , 6 ] ) ;
257
255
let empty = @list:: Nil :: < int > ;
258
- assert ! ( ( list:: has( l , 5 ) ) ) ;
259
- assert ! ( ( !list:: has( l , 7 ) ) ) ;
260
- assert ! ( ( list:: has( l , 8 ) ) ) ;
256
+ assert ! ( ( list:: has( list , 5 ) ) ) ;
257
+ assert ! ( ( !list:: has( list , 7 ) ) ) ;
258
+ assert ! ( ( list:: has( list , 8 ) ) ) ;
261
259
assert ! ( ( !list:: has( empty, 5 ) ) ) ;
262
260
}
263
261
264
262
#[ test]
265
263
fn test_len ( ) {
266
- let l = from_vec ( [ 0 , 1 , 2 ] ) ;
264
+ let list = from_vec ( [ 0 , 1 , 2 ] ) ;
267
265
let empty = @list:: Nil :: < int > ;
268
- assert_eq ! ( list:: len( l ) , 3 u) ;
266
+ assert_eq ! ( list:: len( list ) , 3 u) ;
269
267
assert_eq ! ( list:: len( empty) , 0 u) ;
270
268
}
271
269
0 commit comments