import { curried } from "@tsplus/stdlib/prelude/DSL/_internal/curried" const tupleConstructors: Record unknown> = {} function getTupleConstructor(len: number): (a: unknown) => any { // eslint-disable-next-line no-prototype-builtins if (!tupleConstructors.hasOwnProperty(len)) { tupleConstructors[len] = curried((...t: any[]) => t, len - 1, []) } return tupleConstructors[len]! } /** * @tsplus static DSL tupleF */ export const tupleF = (F: Apply) => >>( ...args: T ): HKT.Kind< F, HKT.Infer, HKT.Infer, { [K in keyof T]: [T[K]] extends [HKT.Kind] ? A : never } > => { const ap = DSL.apF(F) const len = args.length const f = getTupleConstructor(len) let fas = F.map(f)(args[0]!) for (let i = 1; i < len; i++) { fas = ap(args[i]!)(fas) } return fas }