import type * as P from "@principia/prelude"; import * as HKT from "@principia/prelude/HKT"; import { zipWith_ } from "./apply"; import { Functor } from "./functor"; import type { URI, V } from "./model"; import { unit } from "./unit"; /* * ------------------------------------------- * Applicative Array * ------------------------------------------- */ export const zip_ = (fa: ReadonlyArray, fb: ReadonlyArray): ReadonlyArray => zipWith_(fa, fb, (a, b) => [a, b]); export const zip = (fb: ReadonlyArray) => (fa: ReadonlyArray): ReadonlyArray => zip_(fa, fb); export const both_ = zip_; export const both = zip; /** * ```haskell * pure :: a -> Array a * ``` * * Lifts a value into an Array * * @category Applicative * @since 1.0.0 */ export const pure = (a: A): ReadonlyArray => [a]; export const Applicative: P.Applicative<[URI], V> = HKT.instance({ ...Functor, both_: zip_, both: zip, unit });