127 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| var Observable_1 = require("../Observable");
 | |
| var identity_1 = require("../util/identity");
 | |
| var isScheduler_1 = require("../util/isScheduler");
 | |
| function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
 | |
|     var resultSelector;
 | |
|     var initialState;
 | |
|     if (arguments.length == 1) {
 | |
|         var options = initialStateOrOptions;
 | |
|         initialState = options.initialState;
 | |
|         condition = options.condition;
 | |
|         iterate = options.iterate;
 | |
|         resultSelector = options.resultSelector || identity_1.identity;
 | |
|         scheduler = options.scheduler;
 | |
|     }
 | |
|     else if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {
 | |
|         initialState = initialStateOrOptions;
 | |
|         resultSelector = identity_1.identity;
 | |
|         scheduler = resultSelectorOrObservable;
 | |
|     }
 | |
|     else {
 | |
|         initialState = initialStateOrOptions;
 | |
|         resultSelector = resultSelectorOrObservable;
 | |
|     }
 | |
|     return new Observable_1.Observable(function (subscriber) {
 | |
|         var state = initialState;
 | |
|         if (scheduler) {
 | |
|             return scheduler.schedule(dispatch, 0, {
 | |
|                 subscriber: subscriber,
 | |
|                 iterate: iterate,
 | |
|                 condition: condition,
 | |
|                 resultSelector: resultSelector,
 | |
|                 state: state
 | |
|             });
 | |
|         }
 | |
|         do {
 | |
|             if (condition) {
 | |
|                 var conditionResult = void 0;
 | |
|                 try {
 | |
|                     conditionResult = condition(state);
 | |
|                 }
 | |
|                 catch (err) {
 | |
|                     subscriber.error(err);
 | |
|                     return undefined;
 | |
|                 }
 | |
|                 if (!conditionResult) {
 | |
|                     subscriber.complete();
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             var value = void 0;
 | |
|             try {
 | |
|                 value = resultSelector(state);
 | |
|             }
 | |
|             catch (err) {
 | |
|                 subscriber.error(err);
 | |
|                 return undefined;
 | |
|             }
 | |
|             subscriber.next(value);
 | |
|             if (subscriber.closed) {
 | |
|                 break;
 | |
|             }
 | |
|             try {
 | |
|                 state = iterate(state);
 | |
|             }
 | |
|             catch (err) {
 | |
|                 subscriber.error(err);
 | |
|                 return undefined;
 | |
|             }
 | |
|         } while (true);
 | |
|         return undefined;
 | |
|     });
 | |
| }
 | |
| exports.generate = generate;
 | |
| function dispatch(state) {
 | |
|     var subscriber = state.subscriber, condition = state.condition;
 | |
|     if (subscriber.closed) {
 | |
|         return undefined;
 | |
|     }
 | |
|     if (state.needIterate) {
 | |
|         try {
 | |
|             state.state = state.iterate(state.state);
 | |
|         }
 | |
|         catch (err) {
 | |
|             subscriber.error(err);
 | |
|             return undefined;
 | |
|         }
 | |
|     }
 | |
|     else {
 | |
|         state.needIterate = true;
 | |
|     }
 | |
|     if (condition) {
 | |
|         var conditionResult = void 0;
 | |
|         try {
 | |
|             conditionResult = condition(state.state);
 | |
|         }
 | |
|         catch (err) {
 | |
|             subscriber.error(err);
 | |
|             return undefined;
 | |
|         }
 | |
|         if (!conditionResult) {
 | |
|             subscriber.complete();
 | |
|             return undefined;
 | |
|         }
 | |
|         if (subscriber.closed) {
 | |
|             return undefined;
 | |
|         }
 | |
|     }
 | |
|     var value;
 | |
|     try {
 | |
|         value = state.resultSelector(state.state);
 | |
|     }
 | |
|     catch (err) {
 | |
|         subscriber.error(err);
 | |
|         return undefined;
 | |
|     }
 | |
|     if (subscriber.closed) {
 | |
|         return undefined;
 | |
|     }
 | |
|     subscriber.next(value);
 | |
|     if (subscriber.closed) {
 | |
|         return undefined;
 | |
|     }
 | |
|     return this.schedule(state);
 | |
| }
 | |
| //# sourceMappingURL=generate.js.map
 | 
