import { SchedulerLike } from '../types'; | |
import { Observable } from '../Observable'; | |
import { EMPTY } from './empty'; | |
export function range(start: number, count?: number): Observable<number>; | |
/** | |
* @deprecated The `scheduler` parameter will be removed in v8. Use `range(start, count).pipe(observeOn(scheduler))` instead. Details: Details: https://rxjs.dev/deprecations/scheduler-argument | |
*/ | |
export function range(start: number, count: number | undefined, scheduler: SchedulerLike): Observable<number>; | |
/** | |
* Creates an Observable that emits a sequence of numbers within a specified | |
* range. | |
* | |
* <span class="informal">Emits a sequence of numbers in a range.</span> | |
* | |
*  | |
* | |
* `range` operator emits a range of sequential integers, in order, where you | |
* select the `start` of the range and its `length`. By default, uses no | |
* {@link SchedulerLike} and just delivers the notifications synchronously, but may use | |
* an optional {@link SchedulerLike} to regulate those deliveries. | |
* | |
* ## Example | |
* | |
* Produce a range of numbers | |
* | |
* ```ts | |
* import { range } from 'rxjs'; | |
* | |
* const numbers = range(1, 3); | |
* | |
* numbers.subscribe({ | |
* next: value => console.log(value), | |
* complete: () => console.log('Complete!') | |
* }); | |
* | |
* // Logs: | |
* // 1 | |
* // 2 | |
* // 3 | |
* // 'Complete!' | |
* ``` | |
* | |
* @see {@link timer} | |
* @see {@link interval} | |
* | |
* @param {number} [start=0] The value of the first integer in the sequence. | |
* @param {number} count The number of sequential integers to generate. | |
* @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling | |
* the emissions of the notifications. | |
* @return {Observable} An Observable of numbers that emits a finite range of | |
* sequential integers. | |
*/ | |
export function range(start: number, count?: number, scheduler?: SchedulerLike): Observable<number> { | |
if (count == null) { | |
// If one argument was passed, it's the count, not the start. | |
count = start; | |
start = 0; | |
} | |
if (count <= 0) { | |
// No count? We're going nowhere. Return EMPTY. | |
return EMPTY; | |
} | |
// Where the range should stop. | |
const end = count + start; | |
return new Observable( | |
scheduler | |
? // The deprecated scheduled path. | |
(subscriber) => { | |
let n = start; | |
return scheduler.schedule(function () { | |
if (n < end) { | |
subscriber.next(n++); | |
this.schedule(); | |
} else { | |
subscriber.complete(); | |
} | |
}); | |
} | |
: // Standard synchronous range. | |
(subscriber) => { | |
let n = start; | |
while (n < end && !subscriber.closed) { | |
subscriber.next(n++); | |
} | |
subscriber.complete(); | |
} | |
); | |
} | |