Skip to content

Decoder<A> abstract mixin

abstract mixin class Decoder<A>

Annotations: @immutable

Decodes a Json value (or cursor position) into a Dart type A.

Use the static factory methods and primitive instances as building blocks. Combine decoders with map, flatMap, emap, at, optional, or, prepare, handleError, and recoverWith.

Implementers

Constructors

Decoder()

Decoder()

Properties

hashCode no setter inherited

int get hashCode

The hash code for this object.

A hash code is a single integer which represents the state of the object that affects operator == comparisons.

All objects have hash codes. The default hash code implemented by Object represents only the identity of the object, the same way as the default operator == implementation only considers objects equal if they are identical (see identityHashCode).

If operator == is overridden to use the object state instead, the hash code must also be changed to represent that state, otherwise the object cannot be used in hash based data structures like the default Set and Map implementations.

Hash codes must be the same for objects that are equal to each other according to operator ==. The hash code of an object should only change if the object changes in a way that affects equality. There are no further requirements for the hash codes. They need not be consistent between executions of the same program and there are no distribution guarantees.

Objects that are not equal are allowed to have the same hash code. It is even technically allowed that all instances have the same hash code, but if clashes happen too often, it may reduce the efficiency of hash-based data structures like HashSet or HashMap.

If a subclass overrides hashCode, it should override the operator == operator as well to maintain consistency.

Inherited from Object.

Implementation
dart
external int get hashCode;

runtimeType no setter inherited

Type get runtimeType

A representation of the runtime type of the object.

Inherited from Object.

Implementation
dart
external Type get runtimeType;

Methods

at()

Decoder<A> at(String key)

Returns a decoder that navigates into key before decoding.

Implementation
dart
Decoder<A> at(String key) => DownFieldDecoder(key, this);

decode()

Decodes json by wrapping it in a root cursor.

Implementation
dart
DecodeResult<A> decode(Json json) => decodeC(json.hcursor);

decodeC()

Decodes from an HCursor with full history available for error reporting.

Implementation
dart
DecodeResult<A> decodeC(HCursor cursor);

either()

Decoder<Either<A, B>> either<B>(Decoder<B> decodeB)

Returns a decoder that tries this decoder first (producing Left) and falls back to decodeB (producing Right).

Implementation
dart
Decoder<Either<A, B>> either<B>(Decoder<B> decodeB) => EitherDecoder(this, decodeB);

emap()

Decoder<B> emap<B>(Either<String, B> Function(A) f)

Returns a decoder that applies f to the decoded value; f may return Left(message) to signal a failure.

Implementation
dart
Decoder<B> emap<B>(Function1<A, Either<String, B>> f) => EmapDecoder(this, f);

ensure()

Decoder<A> ensure(bool Function(A) p, String Function() message)

Returns a decoder that fails with message if p returns false for the decoded value.

Implementation
dart
Decoder<A> ensure(Function1<A, bool> p, Function0<String> message) => Decoder.instance(
  (c) => decodeC(c).filterOrElse(p, () => DecodingFailure.fromString(message(), c)),
);

flatMap()

Decoder<B> flatMap<B>(Decoder<B> Function(A) f)

Returns a decoder that uses the decoded A to choose the next decoder.

Implementation
dart
Decoder<B> flatMap<B>(Function1<A, Decoder<B>> f) => FlatMapDecoder(this, f);

handleError()

Decoder<A> handleError(A Function(DecodingFailure) f)

Returns a decoder that recovers from failure by applying f to produce a fallback value.

Implementation
dart
Decoder<A> handleError(Function1<DecodingFailure, A> f) =>
    handleErrorWith((err) => Decoder.instance((_) => f(err).asRight()));

handleErrorWith()

Decoder<A> handleErrorWith(Decoder<A> Function(DecodingFailure) f)

Returns a decoder that recovers from failure by using f to choose a fallback decoder.

Implementation
dart
Decoder<A> handleErrorWith(Function1<DecodingFailure, Decoder<A>> f) =>
    HandleErrorDecoder(this, f);

map()

Decoder<B> map<B>(B Function(A) f)

Returns a decoder that maps successfully decoded values through f.

Implementation
dart
Decoder<B> map<B>(Function1<A, B> f) => Decoder.instance((c) => decodeC(c).map(f));

noSuchMethod() inherited

dynamic noSuchMethod(Invocation invocation)

Invoked when a nonexistent method or property is accessed.

A dynamic member invocation can attempt to call a member which doesn't exist on the receiving object. Example:

dart
dynamic object = 1;
object.add(42); // Statically allowed, run-time error

This invalid code will invoke the noSuchMethod method of the integer 1 with an Invocation representing the .add(42) call and arguments (which then throws).

Classes can override noSuchMethod to provide custom behavior for such invalid dynamic invocations.

A class with a non-default noSuchMethod invocation can also omit implementations for members of its interface. Example:

dart
class MockList<T> implements List<T> {
  noSuchMethod(Invocation invocation) {
    log(invocation);
    super.noSuchMethod(invocation); // Will throw.
  }
}
void main() {
  MockList().add(42);
}

This code has no compile-time warnings or errors even though the MockList class has no concrete implementation of any of the List interface methods. Calls to List methods are forwarded to noSuchMethod, so this code will log an invocation similar to Invocation.method(#add, [42]) and then throw.

If a value is returned from noSuchMethod, it becomes the result of the original invocation. If the value is not of a type that can be returned by the original invocation, a type error occurs at the invocation.

The default behavior is to throw a NoSuchMethodError.

Inherited from Object.

Implementation
dart
@pragma("vm:entry-point")
@pragma("wasm:entry-point")
external dynamic noSuchMethod(Invocation invocation);

optional()

Decoder<Option<A>> optional()

Returns a decoder that wraps the result in Option, treating JNull or a missing field as None.

Implementation
dart
Decoder<Option<A>> optional() => OptionDecoder(this);

or()

Decoder<A> or(Decoder<A> d)

Returns a decoder that tries this decoder first, falling back to d if it fails.

Implementation
dart
Decoder<A> or(Decoder<A> d) => OrDecoder(this, d);

prepare()

Decoder<A> prepare(ACursor Function(ACursor) f)

Returns a decoder that applies f to the cursor before decoding.

Implementation
dart
Decoder<A> prepare(Function1<ACursor, ACursor> f) => PreparedDecoder(this, f);

recover()

Decoder<A> recover(A a)

Returns a decoder that falls back to a on failure.

Implementation
dart
Decoder<A> recover(A a) => recoverWith(Decoder.instance((_) => a.asRight()));

recoverWith()

Decoder<A> recoverWith(Decoder<A> other)

Returns a decoder that falls back to other on failure.

Implementation
dart
Decoder<A> recoverWith(Decoder<A> other) => handleErrorWith((_) => other);

toString() inherited

String toString()

A string representation of this object.

Some classes have a default textual representation, often paired with a static parse function (like int.parse). These classes will provide the textual representation as their string representation.

Other classes have no meaningful textual representation that a program will care about. Such classes will typically override toString to provide useful information when inspecting the object, mainly for debugging or logging.

Inherited from Object.

Implementation
dart
external String toString();

tryDecodeC()

DecodeResult<DecodingFailure, A> tryDecodeC(ACursor cursor)

Decodes from an ACursor, returning a failure if the cursor is in a failed state.

Implementation
dart
DecodeResult<A> tryDecodeC(ACursor cursor) =>
    cursor is HCursor ? decodeC(cursor) : _cursorToFailure(cursor).asLeft();

Operators

operator ==() inherited

bool operator ==(Object other)

The equality operator.

The default behavior for all Objects is to return true if and only if this object and other are the same object.

Override this method to specify a different equality relation on a class. The overriding method must still be an equivalence relation. That is, it must be:

  • Total: It must return a boolean for all arguments. It should never throw.

  • Reflexive: For all objects o, o == o must be true.

  • Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must either both be true, or both be false.

  • Transitive: For all objects o1, o2, and o3, if o1 == o2 and o2 == o3 are true, then o1 == o3 must be true.

The method should also be consistent over time, so whether two objects are equal should only change if at least one of the objects was modified.

If a subclass overrides the equality operator, it should override the hashCode method as well to maintain consistency.

Inherited from Object.

Implementation
dart
external bool operator ==(Object other);

Static Properties

bigInt read / write

Decoder<BigInt> bigInt

getter:

/////////////////////////////////////////////////////////////////////////// Primitive Instances /////////////////////////////////////////////////////////////////////////// Decoder for BigInt from a JSON string.

setter:

/////////////////////////////////////////////////////////////////////////// Primitive Instances /////////////////////////////////////////////////////////////////////////// Decoder for BigInt from a JSON string.

Implementation
dart
&#47;&#47;&#47; Decoder for [BigInt] from a JSON string.
static Decoder<BigInt> bigInt = string.emap(
  (a) => Option(BigInt.tryParse(a)).toRight(() => 'BigInt.tryParse failed: $a'),
);

boolean read / write

Decoder<bool> boolean

getter:

Decoder for bool from a JSON boolean.

setter:

Decoder for bool from a JSON boolean.

Implementation
dart
static Decoder<bool> boolean = PrimitiveDecoder(
  (json) =>
      json is JBoolean
          ? json.value.asRight()
          : DecodingFailure(WrongTypeExpectation('bool', json), nil<CursorOp>()).asLeft(),
  (c) =>
      c.value is JBoolean
          ? (c.value as JBoolean).value.asRight()
          : DecodingFailure(WrongTypeExpectation('bool', c.value), c.history()).asLeft(),
);

bytes read / write

Decoder<Uint8List> bytes

getter:

Decoder for Uint8List from a Base64-encoded JSON string.

setter:

Decoder for Uint8List from a Base64-encoded JSON string.

Implementation
dart
static Decoder<Uint8List> bytes = string.map(base64Decode);

dateTime read / write

Decoder<DateTime> dateTime

getter:

Decoder for DateTime from an ISO-8601 JSON string.

setter:

Decoder for DateTime from an ISO-8601 JSON string.

Implementation
dart
static Decoder<DateTime> dateTime = string.emap(
  (a) => Either.catching(() => DateTime.parse(a), (err, _) => err.toString()),
);

dubble read / write

Decoder<double> dubble

getter:

Decoder for double from a JSON number.

setter:

Decoder for double from a JSON number.

Implementation
dart
static Decoder<double> dubble = PrimitiveDecoder(
  (json) {
    if (json is JNumber) {
      return json.value.toDouble().asRight();
    } else if (json is JNull) {
      return double.nan.asRight();
    } else {
      return DecodingFailure(WrongTypeExpectation('double', json), nil<CursorOp>()).asLeft();
    }
  },
  (c) {
    if (c.value is JNumber) {
      return (c.value as JNumber).value.toDouble().asRight();
    } else if (c.value is JNull) {
      return double.nan.asRight();
    } else {
      return DecodingFailure(WrongTypeExpectation('double', c.value), c.history()).asLeft();
    }
  },
);

duration read / write

Decoder<Duration> duration

getter:

Decoder for Duration from a JSON integer (microseconds).

setter:

Decoder for Duration from a JSON integer (microseconds).

Implementation
dart
static Decoder<Duration> duration = integer.map((a) => Duration(microseconds: a));

integer read / write

Decoder<int> integer

getter:

Decoder for int from a JSON number.

setter:

Decoder for int from a JSON number.

Implementation
dart
static Decoder<int> integer = PrimitiveDecoder(
  (json) {
    if (json is JNumber) {
      final v = json.value;

      if (v is int) {
        return v.asRight();
      } else {
        return DecodingFailure(
          CustomReason('Found decimal ($v). Expected integer.'),
          nil<CursorOp>(),
        ).asLeft();
      }
    } else {
      return DecodingFailure(WrongTypeExpectation('int', json), nil<CursorOp>()).asLeft();
    }
  },
  (c) {
    if (c.value is JNumber) {
      final v = (c.value as JNumber).value;
      if (v is int) {
        return v.asRight();
      } else {
        return DecodingFailure(
          CustomReason('Found decimal ($v). Expected integer.'),
          c.history(),
        ).asLeft();
      }
    } else {
      return DecodingFailure(WrongTypeExpectation('int', c.value), c.history()).asLeft();
    }
  },
);

json read / write

getter:

Decoder that returns the focused Json unchanged.

setter:

Decoder that returns the focused Json unchanged.

Implementation
dart
static Decoder<Json> json = Decoder.instance((c) => c.value.asRight());

number read / write

Decoder<num> number

getter:

Decoder for num from a JSON number.

setter:

Decoder for num from a JSON number.

Implementation
dart
static Decoder<num> number = PrimitiveDecoder(
  (json) =>
      json is JNumber
          ? json.value.asRight()
          : DecodingFailure(WrongTypeExpectation('num', json), nil<CursorOp>()).asLeft(),
  (c) =>
      c.value is JNumber
          ? (c.value as JNumber).value.asRight()
          : DecodingFailure(WrongTypeExpectation('num', c.value), c.history()).asLeft(),
);

string read / write

Decoder<String> string

getter:

Decoder for String from a JSON string.

setter:

Decoder for String from a JSON string.

Implementation
dart
static Decoder<String> string = PrimitiveDecoder(
  (json) =>
      json is JString
          ? json.value.asRight()
          : DecodingFailure(WrongTypeExpectation('String', json), nil<CursorOp>()).asLeft(),
  (c) =>
      c.value is JString
          ? (c.value as JString).value.asRight()
          : DecodingFailure(WrongTypeExpectation('String', c.value), c.history()).asLeft(),
);

Static Methods

constant()

Decoder<A> constant<A>(A a)

A decoder that always succeeds with a, ignoring the input.

Implementation
dart
static Decoder<A> constant<A>(A a) => Decoder.instance((_) => Right(a));

enumerationByIndex()

Decoder<T> enumerationByIndex<T extends Enum>(List<T> values)

Decoder for Enum subtype T from a JSON integer index.

Implementation
dart
static Decoder<T> enumerationByIndex<T extends Enum>(List<T> values) => integer.emap(
  (index) => IList.fromDart(
    values,
  ).find((v) => v.index == index).toRight(() => 'Invalid enum index for $T: $index'),
);

enumerationByName()

Decoder<T> enumerationByName<T extends Enum>(List<T> values)

Decoder for Enum subtype T from a JSON string name.

Implementation
dart
static Decoder<T> enumerationByName<T extends Enum>(List<T> values) => string.emap(
  (name) => IList.fromDart(
    values,
  ).find((v) => v.name == name).toRight(() => 'Invalid enum name for $T: $name'),
);

failed()

Decoder<A> failed<A>(DecodingFailure failure)

A decoder that always fails with failure.

Implementation
dart
static Decoder<A> failed<A>(DecodingFailure failure) => Decoder.instance((_) => Left(failure));

failedWithMessage()

Decoder<A> failedWithMessage<A>(String message)

A decoder that always fails with a CustomReason message.

Implementation
dart
static Decoder<A> failedWithMessage<A>(String message) =>
    Decoder.instance((c) => Left(DecodingFailure(CustomReason(message), c.history())));

ilist()

Decoder<IList<A>> ilist<A>(Decoder<A> decodeA)

Decoder for IList<A> from a JSON array.

Implementation
dart
static Decoder<IList<A>> ilist<A>(Decoder<A> decodeA) => list(decodeA).map(IList.fromDart);

imapOf()

Decoder<IMap<K, V>> imapOf<K, V>(KeyDecoder<K> decodeK, Decoder<V> decodeV)

Decoder for IMap<K, V> from a JSON object.

Implementation
dart
static Decoder<IMap<K, V>> imapOf<K, V>(KeyDecoder<K> decodeK, Decoder<V> decodeV) =>
    mapOf(decodeK, decodeV).map(IMap.fromDart);

instance()

Decoder<A> instance<A>(
  DecodeResult<DecodingFailure, A> Function(HCursor) decodeF,
)

Creates a Decoder from a function.

Implementation
dart
static Decoder<A> instance<A>(Function1<HCursor, DecodeResult<A>> decodeF) => DecoderF(decodeF);

list()

Decoder<List<A>> list<A>(Decoder<A> decodeA)

Decoder for List<A> from a JSON array.

Implementation
dart
static Decoder<List<A>> list<A>(Decoder<A> decodeA) => ListDecoder(decodeA);

mapOf()

Decoder<Map<K, V>> mapOf<K, V>(KeyDecoder<K> decodeK, Decoder<V> decodeV)

Decoder for Map<K, V> from a JSON object.

Implementation
dart
static Decoder<Map<K, V>> mapOf<K, V>(KeyDecoder<K> decodeK, Decoder<V> decodeV) =>
    MapDecoder<K, V>(decodeK, decodeV);

nonEmptyIList()

Decoder<NonEmptyIList<A>> nonEmptyIList<A>(Decoder<A> decodeA)

Decoder for NonEmptyIList<A> from a non-empty JSON array.

Implementation
dart
static Decoder<NonEmptyIList<A>> nonEmptyIList<A>(Decoder<A> decodeA) =>
    NonEmptyIListDecoder(decodeA);

product10()

Decoder<K> product10<A, B, C, D, E, F, G, H, I, J, K>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  K Function(A, B, C, D, E, F, G, H, I, J) apply,
)
Implementation
dart
static Decoder<K> product10<A, B, C, D, E, F, G, H, I, J, K>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Function10<A, B, C, D, E, F, G, H, I, J, K> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
  ).mapN(apply),
);

product11()

Decoder<L> product11<A, B, C, D, E, F, G, H, I, J, K, L>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  L Function(A, B, C, D, E, F, G, H, I, J, K) apply,
)
Implementation
dart
static Decoder<L> product11<A, B, C, D, E, F, G, H, I, J, K, L>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Function11<A, B, C, D, E, F, G, H, I, J, K, L> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
  ).mapN(apply),
);

product12()

Decoder<M> product12<A, B, C, D, E, F, G, H, I, J, K, L, M>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  M Function(A, B, C, D, E, F, G, H, I, J, K, L) apply,
)
Implementation
dart
static Decoder<M> product12<A, B, C, D, E, F, G, H, I, J, K, L, M>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Function12<A, B, C, D, E, F, G, H, I, J, K, L, M> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
  ).mapN(apply),
);

product13()

Decoder<N> product13<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  N Function(A, B, C, D, E, F, G, H, I, J, K, L, M) apply,
)
Implementation
dart
static Decoder<N> product13<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Function13<A, B, C, D, E, F, G, H, I, J, K, L, M, N> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
  ).mapN(apply),
);

product14()

Decoder<O> product14<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  O Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N) apply,
)
Implementation
dart
static Decoder<O> product14<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Function14<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
  ).mapN(apply),
);

product15()

Decoder<P> product15<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  P Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) apply,
)
Implementation
dart
static Decoder<P> product15<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Function15<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
  ).mapN(apply),
);

product16()

Decoder<Q> product16<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Q Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) apply,
)
Implementation
dart
static Decoder<Q> product16<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Function16<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
    decoderP.decodeC(cursor),
  ).mapN(apply),
);

product17()

Decoder<R> product17<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  R Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q) apply,
)
Implementation
dart
static Decoder<R> product17<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Function17<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
    decoderP.decodeC(cursor),
    decoderQ.decodeC(cursor),
  ).mapN(apply),
);

product18()

Decoder<S> product18<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  S Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R) apply,
)
Implementation
dart
static Decoder<S> product18<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Function18<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
    decoderP.decodeC(cursor),
    decoderQ.decodeC(cursor),
    decoderR.decodeC(cursor),
  ).mapN(apply),
);

product19()

Decoder<T> product19<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  T Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S) apply,
)
Implementation
dart
static Decoder<T> product19<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  Function19<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
    decoderP.decodeC(cursor),
    decoderQ.decodeC(cursor),
    decoderR.decodeC(cursor),
    decoderS.decodeC(cursor),
  ).mapN(apply),
);

product2()

Decoder<C> product2<A, B, C>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  C Function(A, B) apply,
)
Implementation
dart
static Decoder<C> product2<A, B, C>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Function2<A, B, C> apply,
) => Decoder.instance(
  (cursor) => (decoderA.decodeC(cursor), decoderB.decodeC(cursor)).mapN(apply),
);

product20()

Decoder<U> product20<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  Decoder<T> decoderT,
  U Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T) apply,
)
Implementation
dart
static Decoder<U> product20<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  Decoder<T> decoderT,
  Function20<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
    decoderP.decodeC(cursor),
    decoderQ.decodeC(cursor),
    decoderR.decodeC(cursor),
    decoderS.decodeC(cursor),
    decoderT.decodeC(cursor),
  ).mapN(apply),
);

product21()

Decoder<V> product21<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  Decoder<T> decoderT,
  Decoder<U> decoderU,
  V Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U) apply,
)
Implementation
dart
static Decoder<V> product21<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  Decoder<T> decoderT,
  Decoder<U> decoderU,
  Function21<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
    decoderP.decodeC(cursor),
    decoderQ.decodeC(cursor),
    decoderR.decodeC(cursor),
    decoderS.decodeC(cursor),
    decoderT.decodeC(cursor),
    decoderU.decodeC(cursor),
  ).mapN(apply),
);

product22()

Decoder<W> product22<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  Decoder<T> decoderT,
  Decoder<U> decoderU,
  Decoder<V> decoderV,
  W Function(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V) apply,
)
Implementation
dart
static Decoder<W> product22<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Decoder<J> decoderJ,
  Decoder<K> decoderK,
  Decoder<L> decoderL,
  Decoder<M> decoderM,
  Decoder<N> decoderN,
  Decoder<O> decoderO,
  Decoder<P> decoderP,
  Decoder<Q> decoderQ,
  Decoder<R> decoderR,
  Decoder<S> decoderS,
  Decoder<T> decoderT,
  Decoder<U> decoderU,
  Decoder<V> decoderV,
  Function22<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
    decoderJ.decodeC(cursor),
    decoderK.decodeC(cursor),
    decoderL.decodeC(cursor),
    decoderM.decodeC(cursor),
    decoderN.decodeC(cursor),
    decoderO.decodeC(cursor),
    decoderP.decodeC(cursor),
    decoderQ.decodeC(cursor),
    decoderR.decodeC(cursor),
    decoderS.decodeC(cursor),
    decoderT.decodeC(cursor),
    decoderU.decodeC(cursor),
    decoderV.decodeC(cursor),
  ).mapN(apply),
);

product3()

Decoder<D> product3<A, B, C, D>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  D Function(A, B, C) apply,
)
Implementation
dart
static Decoder<D> product3<A, B, C, D>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Function3<A, B, C, D> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
  ).mapN(apply),
);

product4()

Decoder<E> product4<A, B, C, D, E>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  E Function(A, B, C, D) apply,
)
Implementation
dart
static Decoder<E> product4<A, B, C, D, E>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Function4<A, B, C, D, E> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
  ).mapN(apply),
);

product5()

Decoder<F> product5<A, B, C, D, E, F>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  F Function(A, B, C, D, E) apply,
)
Implementation
dart
static Decoder<F> product5<A, B, C, D, E, F>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Function5<A, B, C, D, E, F> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
  ).mapN(apply),
);

product6()

Decoder<G> product6<A, B, C, D, E, F, G>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  G Function(A, B, C, D, E, F) apply,
)
Implementation
dart
static Decoder<G> product6<A, B, C, D, E, F, G>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Function6<A, B, C, D, E, F, G> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
  ).mapN(apply),
);

product7()

Decoder<H> product7<A, B, C, D, E, F, G, H>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  H Function(A, B, C, D, E, F, G) apply,
)
Implementation
dart
static Decoder<H> product7<A, B, C, D, E, F, G, H>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Function7<A, B, C, D, E, F, G, H> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
  ).mapN(apply),
);

product8()

Decoder<I> product8<A, B, C, D, E, F, G, H, I>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  I Function(A, B, C, D, E, F, G, H) apply,
)
Implementation
dart
static Decoder<I> product8<A, B, C, D, E, F, G, H, I>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Function8<A, B, C, D, E, F, G, H, I> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
  ).mapN(apply),
);

product9()

Decoder<J> product9<A, B, C, D, E, F, G, H, I, J>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  J Function(A, B, C, D, E, F, G, H, I) apply,
)
Implementation
dart
static Decoder<J> product9<A, B, C, D, E, F, G, H, I, J>(
  Decoder<A> decoderA,
  Decoder<B> decoderB,
  Decoder<C> decoderC,
  Decoder<D> decoderD,
  Decoder<E> decoderE,
  Decoder<F> decoderF,
  Decoder<G> decoderG,
  Decoder<H> decoderH,
  Decoder<I> decoderI,
  Function9<A, B, C, D, E, F, G, H, I, J> apply,
) => Decoder.instance(
  (cursor) => (
    decoderA.decodeC(cursor),
    decoderB.decodeC(cursor),
    decoderC.decodeC(cursor),
    decoderD.decodeC(cursor),
    decoderE.decodeC(cursor),
    decoderF.decodeC(cursor),
    decoderG.decodeC(cursor),
    decoderH.decodeC(cursor),
    decoderI.decodeC(cursor),
  ).mapN(apply),
);

tuple10()

Decoder<Record> tuple10<A, B, C, D, E, F, G, H, I, J>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J)> tuple10<A, B, C, D, E, F, G, H, I, J>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 10) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[10]', c).asLeft();
  }
});

tuple11()

Decoder<Record> tuple11<A, B, C, D, E, F, G, H, I, J, K>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K)> tuple11<A, B, C, D, E, F, G, H, I, J, K>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 11) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[11]', c).asLeft();
  }
});

tuple12()

Decoder<Record> tuple12<A, B, C, D, E, F, G, H, I, J, K, L>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L)> tuple12<A, B, C, D, E, F, G, H, I, J, K, L>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 12) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[12]', c).asLeft();
  }
});

tuple13()

Decoder<Record> tuple13<A, B, C, D, E, F, G, H, I, J, K, L, M>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M)>
tuple13<A, B, C, D, E, F, G, H, I, J, K, L, M>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 13) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[13]', c).asLeft();
  }
});

tuple14()

Decoder<Record> tuple14<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N)>
tuple14<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 14) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[14]', c).asLeft();
  }
});

tuple15()

Decoder<Record> tuple15<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)>
tuple15<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 15) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[15]', c).asLeft();
  }
});

tuple16()

Decoder<Record> tuple16<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)>
tuple16<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 16) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
      decodeP.tryDecodeC(c.downN(15)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[16]', c).asLeft();
  }
});

tuple17()

Decoder<Record> tuple17<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q)>
tuple17<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 17) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
      decodeP.tryDecodeC(c.downN(15)),
      decodeQ.tryDecodeC(c.downN(16)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[17]', c).asLeft();
  }
});

tuple18()

Decoder<Record> tuple18<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R)>
tuple18<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 18) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
      decodeP.tryDecodeC(c.downN(15)),
      decodeQ.tryDecodeC(c.downN(16)),
      decodeR.tryDecodeC(c.downN(17)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[18]', c).asLeft();
  }
});

tuple19()

Decoder<Record> tuple19<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S)>
tuple19<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 19) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
      decodeP.tryDecodeC(c.downN(15)),
      decodeQ.tryDecodeC(c.downN(16)),
      decodeR.tryDecodeC(c.downN(17)),
      decodeS.tryDecodeC(c.downN(18)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[19]', c).asLeft();
  }
});

tuple2()

Decoder<Record> tuple2<A, B>(Decoder<A> decodeA, Decoder<B> decodeB)

/////////////////////////////////////////////////////////////////////////// Tuple Instances ///////////////////////////////////////////////////////////////////////////

Implementation
dart
static Decoder<(A, B)> tuple2<A, B>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 2) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[2]', c).asLeft();
  }
});

tuple20()

Decoder<Record> tuple20<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
  Decoder<T> decodeT,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T)>
tuple20<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
  Decoder<T> decodeT,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 20) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
      decodeP.tryDecodeC(c.downN(15)),
      decodeQ.tryDecodeC(c.downN(16)),
      decodeR.tryDecodeC(c.downN(17)),
      decodeS.tryDecodeC(c.downN(18)),
      decodeT.tryDecodeC(c.downN(19)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[20]', c).asLeft();
  }
});

tuple21()

Decoder<Record> tuple21<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
  Decoder<T> decodeT,
  Decoder<U> decodeU,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U)>
tuple21<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
  Decoder<T> decodeT,
  Decoder<U> decodeU,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 21) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
      decodeP.tryDecodeC(c.downN(15)),
      decodeQ.tryDecodeC(c.downN(16)),
      decodeR.tryDecodeC(c.downN(17)),
      decodeS.tryDecodeC(c.downN(18)),
      decodeT.tryDecodeC(c.downN(19)),
      decodeU.tryDecodeC(c.downN(20)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[21]', c).asLeft();
  }
});

tuple22()

Decoder<Record> tuple22<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
  Decoder<T> decodeT,
  Decoder<U> decodeU,
  Decoder<V> decodeV,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V)>
tuple22<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
  Decoder<J> decodeJ,
  Decoder<K> decodeK,
  Decoder<L> decodeL,
  Decoder<M> decodeM,
  Decoder<N> decodeN,
  Decoder<O> decodeO,
  Decoder<P> decodeP,
  Decoder<Q> decodeQ,
  Decoder<R> decodeR,
  Decoder<S> decodeS,
  Decoder<T> decodeT,
  Decoder<U> decodeU,
  Decoder<V> decodeV,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 22) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
      decodeJ.tryDecodeC(c.downN(9)),
      decodeK.tryDecodeC(c.downN(10)),
      decodeL.tryDecodeC(c.downN(11)),
      decodeM.tryDecodeC(c.downN(12)),
      decodeN.tryDecodeC(c.downN(13)),
      decodeO.tryDecodeC(c.downN(14)),
      decodeP.tryDecodeC(c.downN(15)),
      decodeQ.tryDecodeC(c.downN(16)),
      decodeR.tryDecodeC(c.downN(17)),
      decodeS.tryDecodeC(c.downN(18)),
      decodeT.tryDecodeC(c.downN(19)),
      decodeU.tryDecodeC(c.downN(20)),
      decodeV.tryDecodeC(c.downN(21)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[22]', c).asLeft();
  }
});

tuple3()

Decoder<Record> tuple3<A, B, C>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
)
Implementation
dart
static Decoder<(A, B, C)> tuple3<A, B, C>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 3) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[3]', c).asLeft();
  }
});

tuple4()

Decoder<Record> tuple4<A, B, C, D>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
)
Implementation
dart
static Decoder<(A, B, C, D)> tuple4<A, B, C, D>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 4) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[4]', c).asLeft();
  }
});

tuple5()

Decoder<Record> tuple5<A, B, C, D, E>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
)
Implementation
dart
static Decoder<(A, B, C, D, E)> tuple5<A, B, C, D, E>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 5) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[5]', c).asLeft();
  }
});

tuple6()

Decoder<Record> tuple6<A, B, C, D, E, F>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F)> tuple6<A, B, C, D, E, F>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 6) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[6]', c).asLeft();
  }
});

tuple7()

Decoder<Record> tuple7<A, B, C, D, E, F, G>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G)> tuple7<A, B, C, D, E, F, G>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 7) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[7]', c).asLeft();
  }
});

tuple8()

Decoder<Record> tuple8<A, B, C, D, E, F, G, H>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H)> tuple8<A, B, C, D, E, F, G, H>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 8) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[8]', c).asLeft();
  }
});

tuple9()

Decoder<Record> tuple9<A, B, C, D, E, F, G, H, I>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
)
Implementation
dart
static Decoder<(A, B, C, D, E, F, G, H, I)> tuple9<A, B, C, D, E, F, G, H, I>(
  Decoder<A> decodeA,
  Decoder<B> decodeB,
  Decoder<C> decodeC,
  Decoder<D> decodeD,
  Decoder<E> decodeE,
  Decoder<F> decodeF,
  Decoder<G> decodeG,
  Decoder<H> decodeH,
  Decoder<I> decodeI,
) => DecoderF((c) {
  if (c.value.isArray && (c.value as JArray).value.size == 9) {
    return (
      decodeA.tryDecodeC(c.downN(0)),
      decodeB.tryDecodeC(c.downN(1)),
      decodeC.tryDecodeC(c.downN(2)),
      decodeD.tryDecodeC(c.downN(3)),
      decodeE.tryDecodeC(c.downN(4)),
      decodeF.tryDecodeC(c.downN(5)),
      decodeG.tryDecodeC(c.downN(6)),
      decodeH.tryDecodeC(c.downN(7)),
      decodeI.tryDecodeC(c.downN(8)),
    ).tupled;
  } else {
    return _wrongTypeFail('array[9]', c).asLeft();
  }
});