All files Map3.ts

100% Statements 22/22
100% Branches 2/2
100% Functions 9/9
100% Lines 21/21
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 421x   1x   1x                       1x 1x 1x 1x 1x     1x 4x 4x 4x 4x   4x 1x 3x 1x 2x 1x 1x         1x  
import * as ValidationFn from 'fp-ts/lib/Validation';
 
import Decoder, { Decoded } from './Decoder';
 
export default class Map3<a, b, c, d> extends Decoder<d> {
  private fn: (valueA: a, valueB: b, valueC: c) => d;
  private decoderA: Decoder<a>;
  private decoderB: Decoder<b>;
  private decoderC: Decoder<c>;
 
  constructor(
    fn: (value: a, valueB: b, valueC: c) => d,
    decoderA: Decoder<a>,
    decoderB: Decoder<b>,
    decoderC: Decoder<c>,
  ) {
    super();
    this.decoderA = decoderA;
    this.decoderB = decoderB;
    this.decoderC = decoderC;
    this.fn = fn;
  }
 
  public run(value: unknown): Decoded<d> {
    const decoderA = this.decoderA;
    const decoderB = this.decoderB;
    const decoderC = this.decoderC;
    const fn = this.fn;
 
    return decoderA.run(value).fold(
      (errorsA) => ValidationFn.failure(errorsA),
      (successA) => decoderB.run(value).fold(
        (errorsB) => ValidationFn.failure(errorsB),
        (successB) => decoderC.run(value).fold(
          (errorsC) => ValidationFn.failure(errorsC),
          (successC) => ValidationFn.success(fn(successA, successB, successC)),
        ),
      ),
    );
  }
}