@@ -545,64 +545,41 @@ export const flatten = (data: MIR): number[] => {
545
545
return result ;
546
546
} ;
547
547
548
+ export interface IterateOptions {
549
+ readonly descending ?: boolean ;
550
+ }
551
+
548
552
/**
549
553
* Returns an Iterable with which you can use `for-of` or the spread syntax.
550
554
* @param data - The normalized MultiIntegerRange to iterate over.
555
+ * @param options - Pass `{ descending: true }` to iterate in descending order.
551
556
* @returns An Iterable object.
552
557
* @example
553
558
* Array.from(iterate([[1, 3], [7, 9]])); // [1, 2, 3, 7, 8, 9]
554
- * [...iterate([[-1, 1]])]; // [-1, 0, 1]
559
+ * Array.from(iterate([[1, 3], [7, 9]], { descending: true })); // [9, 8, 7, 3, 2, 1]
560
+ * [...iterate([[-1, 2]])]; // [-1, 0, 1, 2]
555
561
*/
556
- export const iterate = ( data : MIR ) : Iterable < number > => {
557
- if ( isUnbounded ( data ) ) {
562
+ export const iterate = (
563
+ data : MIR ,
564
+ options : IterateOptions = { }
565
+ ) : Iterable < number > => {
566
+ const { descending = false } = options ;
567
+ if ( isUnbounded ( data ) )
558
568
throw new RangeError ( 'Unbounded ranges cannot be iterated over' ) ;
559
- }
560
- return {
561
- [ Symbol . iterator ] : ( ) => {
562
- let i = 0 ,
563
- curRange : Range = data [ i ] ,
564
- j = curRange ? curRange [ 0 ] : undefined ;
565
- return {
566
- next : ( ) => {
567
- if ( ! curRange || j === undefined )
568
- return { done : true , value : undefined } ;
569
- const ret = j ;
570
- if ( ++ j > curRange [ 1 ] ) {
571
- curRange = data [ ++ i ] ;
572
- j = curRange ? curRange [ 0 ] : undefined ;
573
- }
574
- return { done : false , value : ret } ;
575
- }
576
- } ;
577
- }
578
- } ;
579
- } ;
580
569
581
- /**
582
- * Like `iterate`, but iterates in descending order.
583
- * @param data - The normalized MultiIntegerRange to iterate over.
584
- * @returns An Iterable object.
585
- * @example
586
- * Array.from(iterateDesc([[1, 3], [7, 9]])); // [9, 8, 7, 3, 2, 1]
587
- * [...iterateDesc([[-1, 1]])]; // [1, 0, -1]
588
- */
589
- export const iterateDesc = ( data : MIR ) : Iterable < number > => {
590
- if ( isUnbounded ( data ) ) {
591
- throw new RangeError ( 'Unbounded ranges cannot be iterated over' ) ;
592
- }
593
570
return {
594
571
[ Symbol . iterator ] : ( ) => {
595
- let i = data . length - 1 ,
572
+ let i = descending ? data . length - 1 : 0 ,
596
573
curRange : Range = data [ i ] ,
597
- j = curRange ? curRange [ 1 ] : undefined ;
574
+ j = curRange ? ( descending ? curRange [ 1 ] : curRange [ 0 ] ) : undefined ;
598
575
return {
599
576
next : ( ) => {
600
577
if ( ! curRange || j === undefined )
601
578
return { done : true , value : undefined } ;
602
579
const ret = j ;
603
- if ( -- j < curRange [ 0 ] ) {
604
- curRange = data [ -- i ] ;
605
- j = curRange ? curRange [ 1 ] : undefined ;
580
+ if ( descending ? -- j < curRange [ 0 ] : ++ j > curRange [ 1 ] ) {
581
+ curRange = data [ descending ? -- i : ++ i ] ;
582
+ j = curRange ? ( descending ? curRange [ 1 ] : curRange [ 0 ] ) : undefined ;
606
583
}
607
584
return { done : false , value : ret } ;
608
585
}
0 commit comments