Files
xo-cash-utils/source/misc.ts
T
2026-08-10 02:04:51 +00:00

56 lines
1.6 KiB
TypeScript

import type { DeeplyReadonly } from './types';
/**
* Validate the value is within the bounds, returning true if it is within the bounds, false otherwise
*
* @param value - The value to validate
* @param min - The minimum value
* @param max - The maximum value
*
* @returns True if the value is within the bounds, false otherwise
*/
export const isWithinBounds = (value: number, min: number, max: number): boolean => {
if (value < min || value > max) {
return false;
}
return true;
};
/**
* Tries to execute an async function and handles any errors that occur.
* @param fn - The function to execute.
* @param onError - The callback to call if the function fails.
* @returns The result of the function.
*/
export const tryAsync = async (fn: () => unknown, onError?: (error: Error) => void): Promise<void> => {
try {
await fn();
} catch (error) {
const errorInstance = error instanceof Error ? error : new Error(`${error}`);
onError?.(errorInstance);
}
};
/**
* Recursively freezes an object by iterating over all properties and freezing them.
* @param obj - The object to freeze.
* @returns The frozen object.
*/
export const deepFreeze = <T>(value: T): DeeplyReadonly<T> => {
if (value !== null && (typeof value === 'object' || typeof value === 'function')) {
for (const key of Reflect.ownKeys(value)) {
const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
if (descriptor && 'value' in descriptor) {
deepFreeze(descriptor.value);
}
}
Object.freeze(value);
}
return value;
};