/** * Index getter */ export function at(idx: number): (array: ReadonlyArray) => T | undefined { if (idx < 0) { return (array) => array[array.length + idx]; } else { return (array) => array[idx]; } } /** * Array first item getter */ export const first: >( array: T, ) => T[0] | undefined = at(0); /** * Array second item getter */ export const second: >( array: T, ) => T[1] | undefined = at(1); /** * Array third item getter */ export const third: >( array: T, ) => T[2] | undefined = at(2); /** * Array last item getter */ export const last: (array: ReadonlyArray) => T | undefined = at(-1); /** * Applies map and filter on an array, using a single function */ export function fmap( m?: undefined, f?: (val: A) => val is T, ): (array: A[]) => T[]; export function fmap( m?: undefined, f?: (val: A) => boolean, ): (array: A[]) => A[]; export function fmap( m: (val: A) => B, f?: (val: B) => val is T, ): (array: A[]) => T[]; export function fmap( m: (val: A) => B, f?: (val: B) => boolean, ): (array: A[]) => B[]; export function fmap( m?: (val: A) => B, f?: (val: A | B) => boolean, ): (array: A[]) => (A | B)[] { return (array) => { if (m && f) { return array.map(m).filter(f); } else if (m) { return array.map(m); } else if (f) { return array.filter(f); } else { return array.slice(); } }; }