import { curry, Predicate } from '@typed/lambda' import { map, Maybe } from '@typed/maybe' import { findIndex } from '../findIndex' import { NoInfer } from '../NoInfer' /** * Search for a value in a list given a predicate. * @param predicate :: (a -> boolean) * @param list :: [a] * @returns :: Maybe a */ export const find: { (predicate: Predicate>, list: ArrayLike): Maybe (predicate: Predicate): (list: ArrayLike) => Maybe } = curry( (predicate: Predicate>, list: ArrayLike): Maybe => map((index: number) => list[index], findIndex(predicate, list)), ) as { (predicate: Predicate>, list: ArrayLike): Maybe (predicate: Predicate): (list: ArrayLike) => Maybe }