import { curry } from '@typed/lambda' import { fromJust } from './fromJust' import { isNothing } from './isNothing' import { Just } from './Just' import { Maybe } from './Maybe' import { Nothing } from './Nothing' /** * Applies a function with all of the values contained in an array of `Maybe`s. * If *any* of the `Maybe`s are `Nothing`s then `Nothing` is returned. * @name combineArray(f: (...values: Array) => R, maybes: ReadonlyArray>): R */ export const combineArray = curry(__combineArray) as CombineArray function __combineArray( f: (...values: any[]) => R, maybes: ReadonlyArray>, ): Maybe { const containsNothing = maybes.some(isNothing) return containsNothing ? Nothing : Just.of(f(...(maybes as ReadonlyArray>).map(fromJust))) } export type CombineArray = { (f: (valueA: A, valueB: B) => C, maybes: [Maybe, Maybe]): Maybe ( f: (valueA: A, valueB: B, valueC: C) => D, maybes: [Maybe, Maybe, Maybe], ): Maybe ( f: (valueA: A, valueB: B, valueC: C, valueD: D) => E, maybes: [Maybe, Maybe, Maybe, Maybe], ): Maybe ( f: (valueA: A, valueB: B, valueC: C, valueD: D, valueE: E) => F, maybes: [Maybe, Maybe, Maybe, Maybe, Maybe], ): Maybe ( f: (valueA: A, valueB: B, valueC: C, valueD: D, valueE: E, valueF: F) => G, maybes: [Maybe, Maybe, Maybe, Maybe, Maybe, Maybe], ): Maybe (f: (valueA: A, valueB: B) => C): (maybes: [Maybe, Maybe]) => Maybe (f: (valueA: A, valueB: B, valueC: C) => D): ( maybes: [Maybe, Maybe, Maybe], ) => Maybe (f: (valueA: A, valueB: B, valueC: C, valueD: D) => E): ( maybes: [Maybe, Maybe, Maybe, Maybe], ) => Maybe (f: (valueA: A, valueB: B, valueC: C, valueD: D, valueE: E) => F): ( maybes: [Maybe, Maybe, Maybe, Maybe, Maybe], ) => Maybe ( f: (valueA: A, valueB: B, valueC: C, valueD: D, valueE: E, valueF: F) => G, ): (maybes: [Maybe, Maybe, Maybe, Maybe, Maybe, Maybe]) => Maybe (f: ArrayConstructor): { (maybes: [Maybe, Maybe]): Maybe<[A, B]> (maybes: [Maybe, Maybe, Maybe]): Maybe<[A, B, C]> (maybes: [Maybe, Maybe, Maybe, Maybe]): Maybe<[A, B, C, D]> (maybes: [Maybe, Maybe, Maybe, Maybe, Maybe]): Maybe< [A, B, C, D, E] > (maybes: [Maybe, Maybe, Maybe, Maybe, Maybe, Maybe]): Maybe< [A, B, C, D, E, F] > } (f: (...values: any[]) => R, maybes: ReadonlyArray>): Maybe (f: (...values: any[]) => R): (maybes: ReadonlyArray>) => Maybe }