All files / result/operator fold.ts

100% Statements 13/13
100% Branches 4/4
100% Functions 4/4
100% Lines 12/12

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 261x       1x       3x 3x 3x 3x 9x 7x   2x     3x 2x 5x          
import {Failure, Result, ResultType, Success} from '../result';
import {Folder} from 'fnxt/fnxt-types';
 
 
export const fold = <S1, F1, S2, F2>(
  successFolder: Folder<S1, S2>, initSuccess: S2,
  failureFolder: Folder<F1, F2>, initFailure: F2,
) =>
  (results: Result<S1, F1>[]): Result<S2, F2> => {
    const successes: S1[] = [];
    const failures: F1[] = [];
    for (const result of results) {
      if (result.type === ResultType.Success) {
        successes.push(result.value);
      } else {
        failures.push(result.value);
      }
    }
    return (failures.length)
      ? Failure(failures.reduce((p, c) => failureFolder(p, c), initFailure))
      : Success(successes.reduce((p, c) => successFolder(p, c), initSuccess));
 
 
  };