@@ -278,6 +278,110 @@ fn slice_mut<T: copy>(v: [const T], start: uint, end: uint) -> [mutable T] {
278
278
ret result;
279
279
}
280
280
281
+ /*
282
+ Function: split
283
+
284
+ Split the vector `v` by applying each element against the predicate `f`.
285
+ */
286
+ fn split < T : copy > ( v : [ T ] , f : fn ( T ) -> bool ) -> [ [ T ] ] {
287
+ let ln = len ( v) ;
288
+ if ( ln == 0 u) { ret [ ] }
289
+
290
+ let start = 0 u;
291
+ let result = [ ] ;
292
+ while start < ln {
293
+ alt position_from ( v, start, ln, f) {
294
+ none { break }
295
+ some( i) {
296
+ push ( result, slice ( v, start, i) ) ;
297
+ start = i + 1 u;
298
+ }
299
+ }
300
+ }
301
+ push ( result, slice ( v, start, ln) ) ;
302
+ result
303
+ }
304
+
305
+ /*
306
+ Function: splitn
307
+
308
+ Split the vector `v` by applying each element against the predicate `f` up
309
+ to `n` times.
310
+ */
311
+ fn splitn < T : copy > ( v : [ T ] , n : uint , f : fn ( T ) -> bool ) -> [ [ T ] ] {
312
+ let ln = len ( v) ;
313
+ if ( ln == 0 u) { ret [ ] }
314
+
315
+ let start = 0 u;
316
+ let count = n;
317
+ let result = [ ] ;
318
+ while start < ln && count > 0 u {
319
+ alt position_from ( v, start, ln, f) {
320
+ none { break }
321
+ some( i) {
322
+ push ( result, slice ( v, start, i) ) ;
323
+ // Make sure to skip the separator.
324
+ start = i + 1 u;
325
+ count -= 1 u;
326
+ }
327
+ }
328
+ }
329
+ push ( result, slice ( v, start, ln) ) ;
330
+ result
331
+ }
332
+
333
+ /*
334
+ Function: rsplit
335
+
336
+ Reverse split the vector `v` by applying each element against the predicate
337
+ `f`.
338
+ */
339
+ fn rsplit < T : copy > ( v : [ T ] , f : fn ( T ) -> bool ) -> [ [ T ] ] {
340
+ let ln = len ( v) ;
341
+ if ( ln == 0 u) { ret [ ] }
342
+
343
+ let end = ln;
344
+ let result = [ ] ;
345
+ while end > 0 u {
346
+ alt rposition_from ( v, 0 u, end, f) {
347
+ none { break }
348
+ some( i) {
349
+ push ( result, slice ( v, i + 1 u, end) ) ;
350
+ end = i;
351
+ }
352
+ }
353
+ }
354
+ push ( result, slice ( v, 0 u, end) ) ;
355
+ reversed ( result)
356
+ }
357
+
358
+ /*
359
+ Function: rsplitn
360
+
361
+ Reverse split the vector `v` by applying each element against the predicate
362
+ `f` up to `n times.
363
+ */
364
+ fn rsplitn < T : copy > ( v : [ T ] , n : uint , f : fn ( T ) -> bool ) -> [ [ T ] ] {
365
+ let ln = len ( v) ;
366
+ if ( ln == 0 u) { ret [ ] }
367
+
368
+ let end = ln;
369
+ let count = n;
370
+ let result = [ ] ;
371
+ while end > 0 u && count > 0 u {
372
+ alt rposition_from ( v, 0 u, end, f) {
373
+ none { break }
374
+ some( i) {
375
+ push ( result, slice ( v, i + 1 u, end) ) ;
376
+ // Make sure to skip the separator.
377
+ end = i;
378
+ count -= 1 u;
379
+ }
380
+ }
381
+ }
382
+ push ( result, slice ( v, 0 u, end) ) ;
383
+ reversed ( result)
384
+ }
281
385
282
386
// Mutators
283
387
@@ -1641,6 +1745,48 @@ mod tests {
1641
1745
assert v == [ 1 , 2 ] ;
1642
1746
}
1643
1747
1748
+ #[ test]
1749
+ fn test_split ( ) {
1750
+ fn f ( & & x: int ) -> bool { x == 3 }
1751
+
1752
+ assert split( [ ] , f) == [ ] ;
1753
+ assert split( [ 1 , 2 ] , f) == [ [ 1 , 2 ] ] ;
1754
+ assert split( [ 3 , 1 , 2 ] , f) == [ [ ] , [ 1 , 2 ] ] ;
1755
+ assert split( [ 1 , 2 , 3 ] , f) == [ [ 1 , 2 ] , [ ] ] ;
1756
+ assert split( [ 1 , 2 , 3 , 4 , 3 , 5 ] , f) == [ [ 1 , 2 ] , [ 4 ] , [ 5 ] ] ;
1757
+ }
1758
+
1759
+ #[ test]
1760
+ fn test_splitn ( ) {
1761
+ fn f ( & & x: int ) -> bool { x == 3 }
1762
+
1763
+ assert splitn( [ ] , 1 u, f) == [ ] ;
1764
+ assert splitn( [ 1 , 2 ] , 1 u, f) == [ [ 1 , 2 ] ] ;
1765
+ assert splitn( [ 3 , 1 , 2 ] , 1 u, f) == [ [ ] , [ 1 , 2 ] ] ;
1766
+ assert splitn( [ 1 , 2 , 3 ] , 1 u, f) == [ [ 1 , 2 ] , [ ] ] ;
1767
+ assert splitn( [ 1 , 2 , 3 , 4 , 3 , 5 ] , 1 u, f) == [ [ 1 , 2 ] , [ 4 , 3 , 5 ] ] ;
1768
+ }
1769
+
1770
+ #[ test]
1771
+ fn test_rsplit ( ) {
1772
+ fn f ( & & x: int ) -> bool { x == 3 }
1773
+
1774
+ assert rsplit( [ ] , f) == [ ] ;
1775
+ assert rsplit( [ 1 , 2 ] , f) == [ [ 1 , 2 ] ] ;
1776
+ assert rsplit( [ 1 , 2 , 3 ] , f) == [ [ 1 , 2 ] , [ ] ] ;
1777
+ assert rsplit( [ 1 , 2 , 3 , 4 , 3 , 5 ] , f) == [ [ 1 , 2 ] , [ 4 ] , [ 5 ] ] ;
1778
+ }
1779
+
1780
+ #[ test]
1781
+ fn test_rsplitn ( ) {
1782
+ fn f ( & & x: int ) -> bool { x == 3 }
1783
+
1784
+ assert rsplitn( [ ] , 1 u, f) == [ ] ;
1785
+ assert rsplitn( [ 1 , 2 ] , 1 u, f) == [ [ 1 , 2 ] ] ;
1786
+ assert rsplitn( [ 1 , 2 , 3 ] , 1 u, f) == [ [ 1 , 2 ] , [ ] ] ;
1787
+ assert rsplitn( [ 1 , 2 , 3 , 4 , 3 , 5 ] , 1 u, f) == [ [ 1 , 2 , 3 , 4 ] , [ 5 ] ] ;
1788
+ }
1789
+
1644
1790
#[ test]
1645
1791
// FIXME: Windows can't undwind
1646
1792
#[ ignore( cfg( target_os = "win32" ) ) ]
0 commit comments