import { curry, Predicate } from '@typed/lambda' import { Maybe, Nothing } from '@typed/maybe' import { NoInfer } from '../NoInfer' /** * Find the index of a value in an array like * @param predicate :: (a -> boolean) * @param list :: [a] * @returns :: Maybe number */ export const findIndex: { (predicate: Predicate>, list: ArrayLike): Maybe (predicate: Predicate): (list: ArrayLike) => Maybe } = curry( (predicate: Predicate>, list: ArrayLike): Maybe => { for (let i = 0; i < list.length; ++i) { if (predicate(list[i])) { return Maybe.of(i) } } return Nothing }, ) as { (predicate: Predicate>, list: ArrayLike): Maybe (predicate: Predicate): (list: ArrayLike) => Maybe }