2022-12-23 10:27:39 +00:00
|
|
|
import { Config } from '../core/Config.js'
|
2022-12-23 12:52:56 +00:00
|
|
|
import type { FnEqual, FnUnequal } from '../interfaces/relational.js'
|
2022-12-22 05:14:58 +00:00
|
|
|
|
|
|
|
const DBL_EPSILON = Number.EPSILON || 2.2204460492503130808472633361816E-16
|
|
|
|
|
|
|
|
export const equal =
|
2022-12-23 10:27:39 +00:00
|
|
|
(dep: {
|
|
|
|
config: Config
|
2022-12-23 12:52:56 +00:00
|
|
|
}): FnEqual<number> => (x, y) => {
|
2022-12-23 10:27:39 +00:00
|
|
|
const eps = dep.config.epsilon
|
|
|
|
if (eps === null || eps === undefined) return x === y
|
|
|
|
if (x === y) return true
|
|
|
|
if (isNaN(x) || isNaN(y)) return false
|
2022-12-22 16:12:36 +00:00
|
|
|
|
2022-12-23 10:27:39 +00:00
|
|
|
if (isFinite(x) && isFinite(y)) {
|
|
|
|
const diff = Math.abs(x - y)
|
|
|
|
if (diff < DBL_EPSILON) return true
|
|
|
|
return diff <= Math.max(Math.abs(x), Math.abs(y)) * eps
|
2022-12-22 05:14:58 +00:00
|
|
|
}
|
|
|
|
|
2022-12-23 10:27:39 +00:00
|
|
|
return false
|
2022-12-22 05:14:58 +00:00
|
|
|
}
|
2022-12-23 10:27:39 +00:00
|
|
|
|
|
|
|
export const unequal = (dep: {
|
2022-12-23 12:52:56 +00:00
|
|
|
equal: FnEqual<number>
|
|
|
|
}): FnUnequal<number> =>
|
|
|
|
(x, y) => !dep.equal(x, y)
|