import { isDefined } from 'remeda' import { BasicArithmetic, BooleanBinaryOperation } from '../arithmetic' export const findIndexByOp = (op: BooleanBinaryOperation) => (values: N[]) => { for (let i = 1; i < values.length; i++) { const prev = values[i - 1] const curr = values[i] if (isDefined(prev) && isDefined(curr) && op(prev, curr)) { return i } } return undefined } export const isAscending = (a: BasicArithmetic) => (values: N[]) => !isDefined(findIndexByOp(a.gt)(values)) export const isDescending = (a: BasicArithmetic) => (values: N[]) => !isDefined(findIndexByOp(a.lt)(values)) export const isAscendingStrict = (a: BasicArithmetic) => (values: N[]) => !isDefined(findIndexByOp(a.gte)(values)) export const isDescendingStrict = (a: BasicArithmetic) => (values: N[]) => !isDefined(findIndexByOp(a.lte)(values)) export const getArrayComparisons = (arithmetic: BasicArithmetic) => ({ isAscending: isAscending(arithmetic), isDescending: isDescending(arithmetic), isAscendingStrict: isAscendingStrict(arithmetic), isDescendingStrict: isDescendingStrict(arithmetic), })