import { isPromise } from '../../types'; export type TryItReturn = Return extends Promise ? Promise<[Error, undefined] | [undefined, Awaited]> : [Error, undefined] | [undefined, Return]; /** * @name tryIt * @category Async * @description Wraps promise-based code in a try/catch block without forking the control flow * * @param {Function} fn - The function to try * @returns {Function} - The function that will return a tuple with the error and the result * * @example * const wrappedFetch = tryIt(fetch); * const [error, result] = await wrappedFetch('https://jsonplaceholder.typicode.com/todos/1'); * * @example * const [error, result] = await tryIt(fetch)('https://jsonplaceholder.typicode.com/todos/1'); * * @since 0.0.3 */ export function tryIt( fn: (...args: Args) => Return, ) { return (...args: Args): TryItReturn => { try { const result = fn(...args); if (isPromise(result)) return result .then((value) => [undefined, value]) .catch((error) => [error, undefined]) as TryItReturn; return [undefined, result] as TryItReturn; } catch (error) { return [error, undefined] as TryItReturn; } }; }