125 lines
3.6 KiB
JavaScript
125 lines
3.6 KiB
JavaScript
/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */
|
|
import { Observable } from '../Observable';
|
|
import { identity } from '../util/identity';
|
|
import { isScheduler } from '../util/isScheduler';
|
|
export 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;
|
|
scheduler = options.scheduler;
|
|
}
|
|
else if (resultSelectorOrObservable === undefined || isScheduler(resultSelectorOrObservable)) {
|
|
initialState = initialStateOrOptions;
|
|
resultSelector = identity;
|
|
scheduler = resultSelectorOrObservable;
|
|
}
|
|
else {
|
|
initialState = initialStateOrOptions;
|
|
resultSelector = resultSelectorOrObservable;
|
|
}
|
|
return new 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;
|
|
});
|
|
}
|
|
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
|