UNPKG

tamda

Version:

Practical functional programming library for TypeScript

55 lines (48 loc) 1.84 kB
import { infer } from '../function/infer'; import { compareString } from '../helpers/compareString'; import { compareValue } from '../helpers/compareValue'; import { opposite } from '../logic/opposite'; import { sort } from './sort'; /** * Sorts an `array` according to the values extracted by a function `mapFn`. * @param array Array to map. * @param mapFn Function that extracts a value from each item. * @param options Optionally determine whether to sort in reverse (descending). */ export function sortBy<T>(array: T[], mapFn: MapFn<T>, options?: Options): T[]; /** * Returns a function that * sorts an `array` according to the values extracted by a function `mapFn`. * @param mapFn Function that extracts a value from each item. * @param options Optionally determine whether to sort in reverse (descending). */ export function sortBy<T>(mapFn: MapFn<T>, options?: Options): typeof deferred; export function sortBy() { return inferred.apply(undefined, arguments); } /** * Sorts an `array` according to the values extracted by a previously specified function `mapFn`. * @param array Array to map. */ declare function deferred<T>(array: T[]): T[]; type MapFn<T> = (item: T) => any; interface Options { reverse: boolean; } const inferred = infer( <T>(array: T[], mapFn: MapFn<T>, options: Options = { reverse: false }): T[] => sort( array, !options.reverse ? compareFn(mapFn) : opposite(compareFn(mapFn)) ), args => args[0] instanceof Array ); function compareFn<T>(mapFn: MapFn<T>): (itemA: T, itemB: T) => number { return (itemA: T, itemB: T) => { const valueA = mapFn(itemA); const valueB = mapFn(itemB); return typeof valueA === 'string' ? compareString(valueA, valueB) : compareValue(valueA, valueB); }; }