import { Arity0, Arity1, Arity2, Arity3, Arity4, Curry2, Curry3, Curry4 } from '../types' export type PlaceHolder = { readonly ['@@placeholder']: true } // prettier-ignore export type PartialFn = { (f: Arity0, args: Array): Arity0 // Arity 1 (f: Arity1, args: [A]): Arity0 (f: Arity1, args: [PlaceHolder]): typeof f (f: Arity1, args: Array): typeof f // Arity 2 (f: Arity2, args: [A, B]): Arity0 (f: Arity2, args: [A]): Arity1 (f: Arity2, args: Array): Curry2 (f: Arity2, args: [PlaceHolder, B]): Arity1 (f: Arity2, args: [A, PlaceHolder]): Arity1 (f: Arity2, args: [PlaceHolder]): Curry2 (f: Arity2, args: [PlaceHolder, PlaceHolder]): Curry2 // Arity 3 (f: Arity3, args: [A, B, C]): Arity0 (f: Arity3, args: [A, B]): Arity1 (f: Arity3, args: [A]): Curry2 (f: Arity3, args: Array): Curry3 (f: Arity3, args: [PlaceHolder, B, C]): Arity1 (f: Arity3, args: [PlaceHolder, PlaceHolder, C]): Curry2 (f: Arity3, args: [PlaceHolder, B, PlaceHolder]): Curry2 (f: Arity3, args: [A, PlaceHolder, C]): Arity1 (f: Arity3, args: [A, PlaceHolder, PlaceHolder]): Curry2 (f: Arity3, args: [A, B, PlaceHolder]): Arity1 (f: Arity3, args: [PlaceHolder, PlaceHolder, PlaceHolder]): Curry3 // Arity 4 (f: Arity4, args: [A, B, C, D]): Arity0 (f: Arity4, args: [A, B, C]): Arity1 (f: Arity4, args: [A, B]): Curry2 (f: Arity4, args: [A]): Curry3 (f: Arity4, args: Array): Curry4 (f: Arity4, args: [PlaceHolder, B, C, D]): Arity1 (f: Arity4, args: [PlaceHolder, PlaceHolder, C, D]): Curry2 (f: Arity4, args: [PlaceHolder, B, PlaceHolder, D]): Curry2 (f: Arity4, args: [PlaceHolder, B, C, PlaceHolder]): Curry2 (f: Arity4, args: [A, PlaceHolder, C, D]): Arity1 (f: Arity4, args: [A, PlaceHolder, PlaceHolder, D]): Curry2 (f: Arity4, args: [A, PlaceHolder, C, PlaceHolder]): Curry2 (f: Arity4, args: [A, B, PlaceHolder, D]): Arity1 (f: Arity4, args: [A, B, PlaceHolder, PlaceHolder]): Curry2 (f: Arity4, args: [A, B, C, PlaceHolder]): Arity1 (f: Arity4, args: [PlaceHolder, PlaceHolder, PlaceHolder, PlaceHolder]): Curry4 (f: Arity4, args: [PlaceHolder, PlaceHolder, PlaceHolder, D]): Curry3 (f: Arity4, args: [PlaceHolder, PlaceHolder, C, PlaceHolder]): Curry3 (f: Arity4, args: [PlaceHolder, B, PlaceHolder, PlaceHolder]): Curry3 (f: Arity4, args: [A, PlaceHolder, PlaceHolder, PlaceHolder]): Curry3 // curried variants (f: Arity0): Arity0Partial (f: Arity1): Arity1Partial (f: Arity2): Arity2Partial (f: Arity3): Arity3Partial (f: Arity4): Arity4Partial } // prettier-ignore export type Arity0Partial = { (args: Array): Arity0 } // prettier-ignore export type Arity1Partial = { (args: [A]): Arity0 (args: [PlaceHolder]): Arity1 (args: Array): Arity1 } //prettier-ignore export type Arity2Partial = { (args: [A, B]): Arity0 (args: [A]): Arity1 (args: Array): Curry2 (args: [PlaceHolder, B]): Arity1 (args: [A, PlaceHolder]): Arity1 (args: [PlaceHolder]): Curry2 (args: [PlaceHolder, PlaceHolder]): Curry2 } //prettier-ignore export type Arity3Partial = { (args: [A, B, C]): Arity0 (args: [A, B]): Arity1 (args: [A]): Curry2 (args: Array): Curry3 (args: [PlaceHolder, B, C]): Arity1 (args: [PlaceHolder, PlaceHolder, C]): Curry2 (args: [PlaceHolder, B, PlaceHolder]): Curry2 (args: [A, PlaceHolder, C]): Arity1 (args: [A, PlaceHolder, PlaceHolder]): Curry2 (args: [A, B, PlaceHolder]): Arity1 } //prettier-ignore export type Arity4Partial = { (args: [A, B, C, D]): Arity0 (args: [A, B, C]): Arity1 (args: [A, B]): Curry2 (args: [A]): Curry3 (args: Array): Curry4 (args: [PlaceHolder, B, C, D]): Arity1 (args: [PlaceHolder, PlaceHolder, C, D]): Curry2 (args: [PlaceHolder, B, PlaceHolder, D]): Curry2 (args: [PlaceHolder, B, C, PlaceHolder]): Curry2 (args: [A, PlaceHolder, C, D]): Arity1 (args: [A, PlaceHolder, PlaceHolder, D]): Curry2 (args: [A, PlaceHolder, C, PlaceHolder]): Curry2 (args: [A, B, PlaceHolder, D]): Arity1 (args: [A, B, PlaceHolder, PlaceHolder]): Curry2 (args: [A, B, C, PlaceHolder]): Arity1 (args: [PlaceHolder, PlaceHolder, PlaceHolder, PlaceHolder]): Curry4 (args: [PlaceHolder, PlaceHolder, PlaceHolder, D]): Curry3 (args: [PlaceHolder, PlaceHolder, C, PlaceHolder]): Curry3 (args: [PlaceHolder, B, PlaceHolder, PlaceHolder]): Curry3 (args: [A, PlaceHolder, PlaceHolder, PlaceHolder]): Curry3 }