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
}