{"version":3,"file":"tuple.mjs","sources":["../../src/array/tuple.mts"],"sourcesContent":["import { Arr, memoizeFunction, Result } from 'ts-data-forge';\nimport {\n  type AnyType,\n  type TupleTypeInternals,\n  type Type,\n  type TypeOf,\n} from '../type.mjs';\nimport {\n  createAssertFn,\n  createCastFn,\n  createIsFn,\n  createPrimitiveValidationError,\n  prependIndexToValidationErrors,\n  type ValidationError,\n} from '../utils/index.mjs';\n\ntype MapTuple<T extends readonly AnyType[]> = Readonly<{\n  [K in keyof T]: TypeOf<T[K]>;\n}>;\n\nexport const tuple = <const A extends readonly AnyType[]>(\n  types: A,\n  options?: Partial<\n    Readonly<{\n      typeName: string;\n    }>\n  >,\n): Type<MapTuple<A>> => {\n  type T = MapTuple<A>;\n\n  const typeName = options?.typeName ?? 'tuple';\n\n  const getDefaultValue = memoizeFunction((): MapTuple<A> =>\n    // `types` is bound by `AnyType` (payload `any`), so element accessors are\n    // typed `any` inside this generic body; the outer signature keeps it precise.\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n    Arr.map(types, (t) => t.defaultValue),\n  );\n\n  const validate: Type<T>['validate'] = (a) => {\n    if (!Arr.isArray(a)) {\n      return Result.err([\n        createPrimitiveValidationError({\n          actualValue: a,\n          expectedType: 'array',\n          typeName,\n          details: undefined,\n        }),\n      ]);\n    }\n\n    if (a.length !== types.length) {\n      return Result.err([\n        {\n          path: [],\n          actualValue: a,\n          expectedType: typeName,\n          typeName,\n          details: {\n            kind: 'tuple-length',\n            expectedLength: types.length,\n            actualLength: a.length,\n          },\n        } satisfies ValidationError,\n      ]);\n    }\n\n    const errors: readonly ValidationError[] = Arr.generate(function* () {\n      for (const [index, [typeDef, el]] of Arr.zip(types, a).entries()) {\n        const res = typeDef.validate(el);\n\n        if (Result.isErr(res)) {\n          yield* prependIndexToValidationErrors(res.value, index);\n        }\n      }\n    });\n\n    if (Arr.isNonEmpty(errors)) {\n      return Result.err(errors);\n    }\n\n    // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n    return Result.ok(a as T);\n  };\n\n  const fill: Type<T>['fill'] = (a) =>\n    !Arr.isArray(a)\n      ? getDefaultValue()\n      : // eslint-disable-next-line total-functions/no-unsafe-type-assertion, @typescript-eslint/no-unsafe-return\n        (types.map((t, i) => t.fill(a[i])) as MapTuple<A>);\n\n  const prune = (a: T): T =>\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n    Arr.map(types, (t, i) => t.prune(a[i]));\n\n  // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n  return {\n    typeName,\n    get defaultValue() {\n      return getDefaultValue();\n    },\n    fill,\n    prune,\n    validate,\n    is: createIsFn(validate),\n    assertIs: createAssertFn(validate),\n    cast: createCastFn(validate),\n    // Retain the element types so that `at(tupleType, index)` can recover the\n    // Type at a given position.\n    elementTypes: types,\n  } satisfies Type<T> & TupleTypeInternals as Type<T>;\n};\n"],"names":[],"mappings":"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"}