rxjs中的相互递归

时间:2018-10-24 10:19:40

标签: recursion rxjs mutual-recursion

我知道expand会在rxjs中实现递归。我已经找到了许多有关如何实现简单递归的示例,但是对于相互递归而言却没有。

基本上,我需要维护一个最新的结果列表。该列表通过groom$函数进行过滤,并通过fetch$()函数进行更新/扩展,每个函数都交替调用。

我使用状态机进行了第一个实现(传递下一个操作以调用expand),但是我想知道是否有更好的方法使用rxjs进行相互递归。

这是示例代码:

const { of, timer, throwError } = Rx;
const { expand, switchMap, map, concat } = RxOperators;

function groom$(arr) {
    return timer(1000).pipe(map(() => arr.slice(1)));
}

function fetch$(arr) {
    return timer(250).pipe(map(() => [...arr, arr.slice(-1)[0] + 1]));
}

function multiRecurse(initialState, firstOp, transitions) {
  return firstOp(initialState).pipe(
      map((data) => ({data, op: transitions[firstOp]})),
      expand(({data, op}) => {
          if (transitions[op]) {
            return op(data).pipe(map((data) => ({data, op: transitions[op]})));
          } else return throwError(`Unknown next operation: ${op}`);
      }),
      map(({data}) => data)
  );
}

multiRecurse([0], fetch$, {
  [groom$]: fetch$,
  [fetch$]: groom$
});

生成的大理石图(来自https://rxviz.com/v/XJzlBj2o): marble diagram

0 个答案:

没有答案