timing-provider
Version:
An implementation of the timing provider specification.
29 lines (24 loc) • 1.13 kB
text/typescript
import { MonoTypeOperatorFunction, concatMap, from, scan } from 'rxjs';
export const enforceOrder =
<FirstValue, SubsequentValue>(
isFirstValue: (value: FirstValue | SubsequentValue) => value is FirstValue
): MonoTypeOperatorFunction<FirstValue | SubsequentValue> =>
(source) =>
source.pipe(
scan<FirstValue | SubsequentValue, [(FirstValue | SubsequentValue)[], null | SubsequentValue[]]>(
([values, bufferedValues], value) => {
if (isFirstValue(value)) {
if (bufferedValues === null) {
throw new Error('Another value has been identified as the first value already.');
}
return [[value, ...bufferedValues], null];
}
if (bufferedValues === null) {
return [[value], bufferedValues];
}
return [values, [...bufferedValues, value]];
},
[[], []]
),
concatMap(([values]) => from(values))
);