All files / src/rx ofType.ts

90.91% Statements 10/11
83.33% Branches 5/6
100% Functions 5/5
88.89% Lines 8/9

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72                                                                                                                19x     19x 19x     1x 5x 2x 9x     10x    
import * as Rx from 'rxjs/operators';
import { OperatorFunction } from 'rxjs';
import { AC, Action } from '../types';
import { isAction, getACType } from '../utils';
 
export type OfType = {
  <T extends AC>(ac: T): OperatorFunction<Action, ReturnType<T>>;
 
  <T extends AC, T2 extends AC>(ac: [T, T2]): OperatorFunction<
    Action,
    ReturnType<T> | ReturnType<T2>
  >;
 
  <T extends AC, T2 extends AC, T3 extends AC>(
    ac: [T, T2, T3]
  ): OperatorFunction<Action, ReturnType<T> | ReturnType<T2> | ReturnType<T3>>;
 
  <T extends AC, T2 extends AC, T3 extends AC, T4 extends AC>(
    ac: [T, T2, T3, T4]
  ): OperatorFunction<
    Action,
    ReturnType<T> | ReturnType<T2> | ReturnType<T3> | ReturnType<T4>
  >;
 
  <T extends AC, T2 extends AC, T3 extends AC, T4 extends AC, T5 extends AC>(
    ac: [T, T2, T3, T4, T5]
  ): OperatorFunction<
    Action,
    | ReturnType<T>
    | ReturnType<T2>
    | ReturnType<T3>
    | ReturnType<T4>
    | ReturnType<T5>
  >;
 
  <
    T extends AC,
    T2 extends AC,
    T3 extends AC,
    T4 extends AC,
    T5 extends AC,
    T6 extends AC
  >(
    ac: [T, T2, T3, T4, T5, T6]
  ): OperatorFunction<
    Action,
    | ReturnType<T>
    | ReturnType<T2>
    | ReturnType<T3>
    | ReturnType<T4>
    | ReturnType<T5>
    | ReturnType<T6>
  >;
};
 
function compare(ac: AC, action: Action) {
  Iif (!isAction(action)) {
    return false;
  }
  const [symbol, type] = getACType(ac);
  return symbol === action.type[0] && type === action.type[1];
}
 
export const ofType: OfType = (ac: AC | AC[]) => {
  if (Array.isArray(ac)) {
    return Rx.filter((action: any) =>
      ac.some(item => compare(item, action))
    ) as any;
  }
  return Rx.filter((action: any) => compare(ac, action)) as any;
};