diff --git a/src/async/tryit.ts b/src/async/tryit.ts index 5ebd307d..bd5c502b 100644 --- a/src/async/tryit.ts +++ b/src/async/tryit.ts @@ -1,4 +1,4 @@ -import { isPromise } from 'radashi' +import { isPromise, type Result, type ResultPromise } from 'radashi' /** * The result of a `tryit` function. @@ -18,29 +18,36 @@ import { isPromise } from 'radashi' * }) * ``` */ -export type TryitResult = Return extends Promise - ? Promise<[Error, undefined] | [undefined, Awaited]> - : [Error, undefined] | [undefined, Return] +export type TryitResult< + TReturn, + TError extends Error = Error, +> = TReturn extends PromiseLike + ? ResultPromise + : Result /** * A helper to try an async function without forking the control flow. * Returns an error-first callback-_like_ array response as `[Error, * result]` */ -export function tryit( - func: (...args: Args) => Return, -): (...args: Args) => TryitResult { - return (...args) => { +export function tryit< + TArgs extends any[], + TReturn, + TError extends Error = Error, +>( + func: (...args: TArgs) => TReturn, +): (...args: TArgs) => TryitResult { + return (...args): any => { try { const result = func(...args) - if (isPromise(result)) { - return result - .then(value => [undefined, value]) - .catch(err => [err, undefined]) as TryitResult - } - return [undefined, result] as TryitResult + return isPromise(result) + ? result.then( + value => [undefined, value], + err => [err, undefined], + ) + : [undefined, result] } catch (err) { - return [err, undefined] as TryitResult + return [err, undefined] } } }