Skip to content

Commit 45d1aab

Browse files
authored
Merge pull request #562 from sharno/safeTry-to-ResultAsync
Return ResultAsync<T, E> from safeTry instead of Promise<Result<T, E>> for better composability
2 parents 5eb8661 + 16452c9 commit 45d1aab

File tree

4 files changed

+17
-17
lines changed

4 files changed

+17
-17
lines changed

.changeset/safeTryAsyncResult.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'neverthrow': minor
3+
---
4+
5+
change the return type of `safeTry` to be `ResultAsync<T, E>` instead of `Promise<Result<T, E>>` for better composability

src/result.ts

+6-11
Original file line numberDiff line numberDiff line change
@@ -104,31 +104,26 @@ export function safeTry<
104104
* `yield* resultAsync.safeUnwrap()` work as Rust's `result?` expression.
105105
* @returns The first occurence of either an yielded Err or a returned Result.
106106
*/
107-
// NOTE:
108-
// Since body is potentially throwable because `await` can be used in it,
109-
// Promise<Result<T, E>>, not ResultAsync<T, E>, is used as the return type.
110107
export function safeTry<T, E>(
111108
body: () => AsyncGenerator<Err<never, E>, Result<T, E>>,
112-
): Promise<Result<T, E>>
109+
): ResultAsync<T, E>
113110
export function safeTry<
114111
YieldErr extends Err<never, unknown>,
115112
GeneratorReturnResult extends Result<unknown, unknown>
116113
>(
117114
body: () => AsyncGenerator<YieldErr, GeneratorReturnResult>,
118-
): Promise<
119-
Result<
120-
InferOkTypes<GeneratorReturnResult>,
121-
InferErrTypes<YieldErr> | InferErrTypes<GeneratorReturnResult>
122-
>
115+
): ResultAsync<
116+
InferOkTypes<GeneratorReturnResult>,
117+
InferErrTypes<YieldErr> | InferErrTypes<GeneratorReturnResult>
123118
>
124119
export function safeTry<T, E>(
125120
body:
126121
| (() => Generator<Err<never, E>, Result<T, E>>)
127122
| (() => AsyncGenerator<Err<never, E>, Result<T, E>>),
128-
): Result<T, E> | Promise<Result<T, E>> {
123+
): Result<T, E> | ResultAsync<T, E> {
129124
const n = body().next()
130125
if (n instanceof Promise) {
131-
return n.then((r) => r.value)
126+
return new ResultAsync(n.then((r) => r.value))
132127
}
133128
return n.value
134129
}

tests/safe-try.test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ describe("Tests if README's examples work", () => {
177177
})
178178

179179
test("async mayFail1 error", async () => {
180-
function myFunc(): Promise<Result<number, string>> {
180+
function myFunc(): ResultAsync<number, string> {
181181
return safeTry<number, string>(async function*() {
182182
return ok(
183183
(yield* (await promiseBad())
@@ -197,7 +197,7 @@ describe("Tests if README's examples work", () => {
197197
})
198198

199199
test("async mayFail2 error", async () => {
200-
function myFunc(): Promise<Result<number, string>> {
200+
function myFunc(): ResultAsync<number, string> {
201201
return safeTry<number, string>(async function*() {
202202
return ok(
203203
(yield* (await promiseGood())
@@ -217,7 +217,7 @@ describe("Tests if README's examples work", () => {
217217
})
218218

219219
test("promise async all ok", async () => {
220-
function myFunc(): Promise<Result<number, string>> {
220+
function myFunc(): ResultAsync<number, string> {
221221
return safeTry<number, string>(async function*() {
222222
return ok(
223223
(yield* (await promiseGood())

tests/typecheck-tests.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2404,7 +2404,7 @@ type CreateTuple<L, V = string> =
24042404
name: 'ReturnMyError'
24052405
}
24062406

2407-
type Expectation = Promise<Result<string, ReturnMyError>>
2407+
type Expectation = ResultAsync<string, ReturnMyError>
24082408

24092409
const result = safeTry(async function *() {
24102410
return okAsync<string, ReturnMyError>('string');
@@ -2419,7 +2419,7 @@ type CreateTuple<L, V = string> =
24192419
name: 'ReturnMyError';
24202420
}
24212421

2422-
type Expectation = Promise<Result<string, ReturnMyError>>
2422+
type Expectation = ResultAsync<string, ReturnMyError>
24232423

24242424
const result = safeTry(async function *() {
24252425
return errAsync<string, ReturnMyError>({ name: 'ReturnMyError' });
@@ -2460,7 +2460,7 @@ type CreateTuple<L, V = string> =
24602460
name: 'ReturnMyError';
24612461
}
24622462

2463-
type Expectation = Promise<Result<string, FirstYieldMyError | SecondYieldMyError | ReturnMyError>>
2463+
type Expectation = ResultAsync<string, FirstYieldMyError | SecondYieldMyError | ReturnMyError>
24642464

24652465
const result = safeTry(async function *() {
24662466
yield* okAsync<number, FirstYieldMyError>(123).safeUnwrap();

0 commit comments

Comments
 (0)