import { CLAMP_MIN_MAX } from "../errors" ; declare let process ; /** Returns whether `process.env.NODE_ENV` exists and equals `env`. */ export function isNodeEnv ( env ) { return typeof process !== "undefined" && process . env && process . env . NODE_ENV === env ; } /**
 * Returns the difference in length between two arrays. A `null` argument is
 * considered an empty list. The return value will be positive if `a` is longer
 * than `b`, negative if the opposite is true, and zero if their lengths are
 * equal.
 */ export function arrayLengthCompare ( a = [ ] , b = [ ] ) { return a . length - b . length ; } /**
 * Returns true if the two numbers are within the given tolerance of each other.
 * This is useful to correct for floating point precision issues, less useful
 * for integers.
 */ export function approxEqual ( a , b , tolerance = 0.00001 ) { return Math . abs ( a - b ) <= tolerance ; } /**
 * Clamps the given number between min and max values. Returns value if within
 * range, or closest bound.
 */ export function clamp ( val , min , max ) { if ( val == null ) { return val ; } if ( max < min ) { throw new Error ( CLAMP_MIN_MAX ) ; } return Math . min ( Math . max ( val , min ) , max ) ; } /** Returns the number of decimal places in the given number. */ export function countDecimalPlaces ( num ) { if ( ! isFinite ( num ) ) { return 0 ; } let e = 1 ; let p = 0 ; while ( Math . round ( num * e ) / e !== num ) { e *= 10 ; p ++ ; } return p ; } const uniqueCountForNamespace = new Map < string , number > ( ) ; /** Generate a unique ID within a given namespace, using a simple counter-based implementation to avoid collisions. */ export function uniqueId ( namespace ) { const curCount = uniqueCountForNamespace . get ( namespace ) ?? 0 ; uniqueCountForNamespace . set ( namespace , curCount + 1 ) ; return `${ namespace }-${ curCount }` ; }