Skip to content

Commit

Permalink
fix tryit
Browse files Browse the repository at this point in the history
  • Loading branch information
aleclarson committed Aug 16, 2024
1 parent fb194f0 commit b61d31f
Showing 1 changed file with 22 additions and 15 deletions.
37 changes: 22 additions & 15 deletions src/async/tryit.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { isPromise } from 'radashi'
import { isPromise, type Result, type ResultPromise } from 'radashi'

/**
* The result of a `tryit` function.
Expand All @@ -18,29 +18,36 @@ import { isPromise } from 'radashi'
* })
* ```
*/
export type TryitResult<Return> = Return extends Promise<any>
? Promise<[Error, undefined] | [undefined, Awaited<Return>]>
: [Error, undefined] | [undefined, Return]
export type TryitResult<
TReturn,
TError extends Error = Error,
> = TReturn extends PromiseLike<infer TResult>
? ResultPromise<TResult, TError>
: Result<TReturn, TError>

/**
* 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<Args extends any[], Return>(
func: (...args: Args) => Return,
): (...args: Args) => TryitResult<Return> {
return (...args) => {
export function tryit<
TArgs extends any[],
TReturn,
TError extends Error = Error,
>(
func: (...args: TArgs) => TReturn,
): (...args: TArgs) => TryitResult<TReturn, TError> {
return (...args): any => {
try {
const result = func(...args)
if (isPromise(result)) {
return result
.then(value => [undefined, value])
.catch(err => [err, undefined]) as TryitResult<Return>
}
return [undefined, result] as TryitResult<Return>
return isPromise(result)
? result.then(
value => [undefined, value],
err => [err, undefined],
)
: [undefined, result]
} catch (err) {
return [err, undefined] as TryitResult<Return>
return [err, undefined]
}
}
}
Expand Down

0 comments on commit b61d31f

Please sign in to comment.