import { SchedulerAction, SchedulerLike } from '../types'; 
 | 
import { Observable } from '../Observable'; 
 | 
  
 | 
/** 
 | 
 * 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 
 | 
 * Emits the numbers 1 to 10</caption> 
 | 
 * ```ts 
 | 
 * import { range } from 'rxjs'; 
 | 
 * 
 | 
 * const numbers = range(1, 10); 
 | 
 * numbers.subscribe(x => console.log(x)); 
 | 
 * ``` 
 | 
 * @see {@link timer} 
 | 
 * @see {@link index/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. 
 | 
 * @static true 
 | 
 * @name range 
 | 
 * @owner Observable 
 | 
 */ 
 | 
export function range(start: number = 0, 
 | 
                      count?: number, 
 | 
                      scheduler?: SchedulerLike): Observable<number> { 
 | 
  return new Observable<number>(subscriber => { 
 | 
    if (count === undefined) { 
 | 
      count = start; 
 | 
      start = 0; 
 | 
    } 
 | 
  
 | 
    let index = 0; 
 | 
    let current = start; 
 | 
  
 | 
    if (scheduler) { 
 | 
      return scheduler.schedule(dispatch, 0, { 
 | 
        index, count, start, subscriber 
 | 
      }); 
 | 
    } else { 
 | 
      do { 
 | 
        if (index++ >= count) { 
 | 
          subscriber.complete(); 
 | 
          break; 
 | 
        } 
 | 
        subscriber.next(current++); 
 | 
        if (subscriber.closed) { 
 | 
          break; 
 | 
        } 
 | 
      } while (true); 
 | 
    } 
 | 
  
 | 
    return undefined; 
 | 
  }); 
 | 
} 
 | 
  
 | 
/** @internal */ 
 | 
export function dispatch(this: SchedulerAction<any>, state: any) { 
 | 
  const { start, index, count, subscriber } = state; 
 | 
  
 | 
  if (index >= count) { 
 | 
    subscriber.complete(); 
 | 
    return; 
 | 
  } 
 | 
  
 | 
  subscriber.next(start); 
 | 
  
 | 
  if (subscriber.closed) { 
 | 
    return; 
 | 
  } 
 | 
  
 | 
  state.index = index + 1; 
 | 
  state.start = start + 1; 
 | 
  
 | 
  this.schedule(state); 
 | 
} 
 |