124 lines
3.4 KiB
JavaScript
124 lines
3.4 KiB
JavaScript
|
import { Observable } from '../Observable';
|
||
|
import { identity } from '../util/identity';
|
||
|
import { isScheduler } from '../util/isScheduler';
|
||
|
export function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
|
||
|
let resultSelector;
|
||
|
let initialState;
|
||
|
if (arguments.length == 1) {
|
||
|
const 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(subscriber => {
|
||
|
let state = initialState;
|
||
|
if (scheduler) {
|
||
|
return scheduler.schedule(dispatch, 0, {
|
||
|
subscriber,
|
||
|
iterate,
|
||
|
condition,
|
||
|
resultSelector,
|
||
|
state
|
||
|
});
|
||
|
}
|
||
|
do {
|
||
|
if (condition) {
|
||
|
let conditionResult;
|
||
|
try {
|
||
|
conditionResult = condition(state);
|
||
|
}
|
||
|
catch (err) {
|
||
|
subscriber.error(err);
|
||
|
return undefined;
|
||
|
}
|
||
|
if (!conditionResult) {
|
||
|
subscriber.complete();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
let value;
|
||
|
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) {
|
||
|
const { subscriber, condition } = state;
|
||
|
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) {
|
||
|
let conditionResult;
|
||
|
try {
|
||
|
conditionResult = condition(state.state);
|
||
|
}
|
||
|
catch (err) {
|
||
|
subscriber.error(err);
|
||
|
return undefined;
|
||
|
}
|
||
|
if (!conditionResult) {
|
||
|
subscriber.complete();
|
||
|
return undefined;
|
||
|
}
|
||
|
if (subscriber.closed) {
|
||
|
return undefined;
|
||
|
}
|
||
|
}
|
||
|
let 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
|