@@ -7,14 +7,22 @@ import 'package:dartbag/readable_numbers.dart';
7
7
import 'package:test/test.dart' ;
8
8
9
9
extension < E > on List <E > {
10
- void rotateLeftSlow (
10
+ List < E > rotateLeftCopy (
11
11
int shiftAmount, {
12
12
int ? start,
13
13
int ? end,
14
14
}) {
15
- for (var i = 0 ; i < shiftAmount; i += 1 ) {
16
- rotateLeft (1 , start: start, end: end);
15
+ var copy = toList ();
16
+
17
+ start ?? = 0 ;
18
+ end ?? = length;
19
+
20
+ var rotatedLength = end - start;
21
+ for (var i = 0 ; i < rotatedLength; i += 1 ) {
22
+ copy[i + start] = this [(i + shiftAmount) % rotatedLength + start];
17
23
}
24
+
25
+ return copy;
18
26
}
19
27
}
20
28
@@ -102,7 +110,7 @@ void main() {
102
110
for (var i = 0 ; i < list.length; i += 1 ) {
103
111
expect (
104
112
[...list]..rotateLeft (i),
105
- [...list].. rotateLeftSlow (i),
113
+ [...list].rotateLeftCopy (i),
106
114
reason: 'shiftAmount: $i ' ,
107
115
);
108
116
}
@@ -123,7 +131,7 @@ void main() {
123
131
for (var i = 0 ; i < list.length; i += 1 ) {
124
132
expect (
125
133
[...list]..rotateLeft (- i),
126
- [...list].. rotateLeft (list.length - i),
134
+ [...list].rotateLeftCopy ( - i),
127
135
reason: 'shiftAmount: -$i ' ,
128
136
);
129
137
}
@@ -293,6 +301,219 @@ void main() {
293
301
});
294
302
});
295
303
304
+ test ('Iterable.padLeft:' , () {
305
+ const padValue = - 48 ;
306
+
307
+ expect (< int > [].padLeft (0 , padValue: padValue).toList (), < int > []);
308
+ expect (< int > [].padLeft (1 , padValue: padValue).toList (), [padValue]);
309
+ expect (
310
+ < int > [].padLeft (2 , padValue: padValue).toList (),
311
+ [padValue, padValue],
312
+ );
313
+ expect (< int > [].padLeft (2 , padValue: padValue).length, 2 );
314
+ expect ([0 ].padLeft (0 , padValue: padValue).toList (), [0 ]);
315
+ expect ([0 ].padLeft (1 , padValue: padValue).toList (), [0 ]);
316
+ expect ([0 ].padLeft (2 , padValue: padValue).toList (), [padValue, 0 ]);
317
+ expect (
318
+ [0 ].padLeft (3 , padValue: padValue).toList (),
319
+ [padValue, padValue, 0 ],
320
+ );
321
+ expect ([0 , 1 ].padLeft (0 , padValue: padValue).toList (), [0 , 1 ]);
322
+ expect ([0 , 1 ].padLeft (1 , padValue: padValue).toList (), [0 , 1 ]);
323
+ expect ([0 , 1 ].padLeft (2 , padValue: padValue).toList (), [0 , 1 ]);
324
+ expect ([0 , 1 ].padLeft (3 , padValue: padValue).toList (), [padValue, 0 , 1 ]);
325
+ expect ([0 , 1 ].padLeft (3 , padValue: padValue).length, 3 );
326
+ });
327
+
328
+ test ('Iterable.padRight:' , () {
329
+ const padValue = - 48 ;
330
+
331
+ expect (< int > [].padRight (0 , padValue: 0 ).toList (), < int > []);
332
+ expect (< int > [].padRight (1 , padValue: padValue).toList (), [padValue]);
333
+ expect (
334
+ < int > [].padRight (2 , padValue: padValue).toList (),
335
+ [padValue, padValue],
336
+ );
337
+ expect (< int > [].padRight (2 , padValue: padValue).length, 2 );
338
+ expect ([0 ].padRight (0 , padValue: padValue).toList (), [0 ]);
339
+ expect ([0 ].padRight (1 , padValue: padValue).toList (), [0 ]);
340
+ expect ([0 ].padRight (2 , padValue: padValue).toList (), [0 , padValue]);
341
+ expect (
342
+ [0 ].padRight (3 , padValue: padValue).toList (),
343
+ [0 , padValue, padValue],
344
+ );
345
+ expect ([0 , 1 ].padRight (0 , padValue: padValue).toList (), [0 , 1 ]);
346
+ expect ([0 , 1 ].padRight (1 , padValue: padValue).toList (), [0 , 1 ]);
347
+ expect ([0 , 1 ].padRight (2 , padValue: padValue).toList (), [0 , 1 ]);
348
+ expect ([0 , 1 ].padRight (3 , padValue: padValue).toList (), [0 , 1 , padValue]);
349
+ expect ([0 , 1 ].padRight (3 , padValue: padValue).length, 3 );
350
+ });
351
+
352
+ group ('zipLongest' , () {
353
+ const padValue = - 48 ;
354
+
355
+ test ('Works with finite iterables' , () {
356
+ expect (zipLongest ([< int > []], padValue).toList (), < List <int >> []);
357
+ expect (
358
+ zipLongest (
359
+ [
360
+ < int > [],
361
+ [1 ],
362
+ ],
363
+ padValue,
364
+ ).toList (),
365
+ [
366
+ [padValue, 1 ],
367
+ ]);
368
+ expect (
369
+ zipLongest (
370
+ [
371
+ [1 ],
372
+ < int > [],
373
+ ],
374
+ padValue,
375
+ ).toList (),
376
+ [
377
+ [1 , padValue],
378
+ ]);
379
+ expect (
380
+ zipLongest (
381
+ [
382
+ < int > [],
383
+ [1 ],
384
+ < int > [],
385
+ ],
386
+ padValue,
387
+ ).toList (),
388
+ [
389
+ [padValue, 1 , padValue],
390
+ ]);
391
+
392
+ expect (
393
+ zipLongest (
394
+ [
395
+ [1 , 2 , 3 ],
396
+ ],
397
+ padValue,
398
+ ).toList (),
399
+ [
400
+ [1 ],
401
+ [2 ],
402
+ [3 ],
403
+ ]);
404
+ expect (
405
+ zipLongest (
406
+ [
407
+ < int > [],
408
+ [1 , 2 , 3 ],
409
+ ],
410
+ padValue,
411
+ ).toList (),
412
+ [
413
+ [padValue, 1 ],
414
+ [padValue, 2 ],
415
+ [padValue, 3 ],
416
+ ]);
417
+ expect (
418
+ zipLongest (
419
+ [
420
+ [1 , 2 , 3 ],
421
+ < int > [],
422
+ ],
423
+ padValue,
424
+ ).toList (),
425
+ [
426
+ [1 , padValue],
427
+ [2 , padValue],
428
+ [3 , padValue],
429
+ ]);
430
+
431
+ expect (
432
+ zipLongest (
433
+ [
434
+ [1 , 2 , 3 ],
435
+ [4 , 5 ],
436
+ [6 ],
437
+ ],
438
+ padValue,
439
+ ).toList (),
440
+ [
441
+ [1 , 4 , 6 ],
442
+ [2 , 5 , padValue],
443
+ [3 , padValue, padValue],
444
+ ]);
445
+ });
446
+
447
+ test ('Works with infinite iterables' , () {
448
+ expect (
449
+ zipLongest (
450
+ [
451
+ _naturalNumbers,
452
+ ],
453
+ padValue,
454
+ ).take (5 ).toList (),
455
+ [
456
+ [1 ],
457
+ [2 ],
458
+ [3 ],
459
+ [4 ],
460
+ [5 ],
461
+ ],
462
+ );
463
+
464
+ expect (
465
+ zipLongest (
466
+ [
467
+ _naturalNumbers,
468
+ < int > [],
469
+ ],
470
+ padValue,
471
+ ).take (5 ).toList (),
472
+ [
473
+ [1 , padValue],
474
+ [2 , padValue],
475
+ [3 , padValue],
476
+ [4 , padValue],
477
+ [5 , padValue],
478
+ ],
479
+ );
480
+
481
+ expect (
482
+ zipLongest (
483
+ [
484
+ < int > [],
485
+ _naturalNumbers,
486
+ ],
487
+ padValue,
488
+ ).take (5 ).toList (),
489
+ [
490
+ [padValue, 1 ],
491
+ [padValue, 2 ],
492
+ [padValue, 3 ],
493
+ [padValue, 4 ],
494
+ [padValue, 5 ],
495
+ ],
496
+ );
497
+
498
+ expect (
499
+ zipLongest (
500
+ [
501
+ [- 1 , - 2 , - 3 ],
502
+ _naturalNumbers,
503
+ ],
504
+ padValue,
505
+ ).take (5 ).toList (),
506
+ [
507
+ [- 1 , 1 ],
508
+ [- 2 , 2 ],
509
+ [- 3 , 3 ],
510
+ [padValue, 4 ],
511
+ [padValue, 5 ],
512
+ ],
513
+ );
514
+ });
515
+ });
516
+
296
517
test ('LinkedHashMap.sort' , () {
297
518
final random = Random (0 );
298
519
@@ -462,3 +683,12 @@ bool _isSorted<E extends Comparable<Object>>(Iterable<E> iterable) {
462
683
}
463
684
return true ;
464
685
}
686
+
687
+ /// Returns an infinite [Iterable] of the natural numbers.
688
+ Iterable <int > get _naturalNumbers sync * {
689
+ var i = 1 ;
690
+ while (true ) {
691
+ yield i;
692
+ i += 1 ;
693
+ }
694
+ }
0 commit comments