@@ -33,35 +33,6 @@ export class Result<T = unknown, E = unknown> {
3333 return new Result ( false , error , never ) ;
3434 }
3535
36- static fromValue < T , E = unknown > ( data : Promise < T > ) : Promise < Result < Awaited < T > , E > > ;
37- static fromValue < T > (
38- data : Promise < T > ,
39- onThrow : ErrorConstructor ,
40- ) : Promise < Result < Awaited < T > , Error > > ;
41- static fromValue < T , E > (
42- data : Promise < T > ,
43- onThrow : ( error : unknown ) => E ,
44- ) : Promise < Result < Awaited < T > , E > > ;
45-
46- static fromValue < T , E = unknown > ( data : T ) : Result < T , E > ;
47- static fromValue < T > ( data : T , onThrow : ErrorConstructor ) : Result < T , Error > ;
48- static fromValue < T , E > ( data : T , onThrow : ( error : unknown ) => E ) : Result < T , E > ;
49-
50- static fromValue ( data : unknown , onThrow ?: Fn ) : any {
51- try {
52- if ( ! isPromiseLike ( data ) ) {
53- return this . ok ( data ) ;
54- }
55-
56- return data . then (
57- value => this . ok ( value ) ,
58- error => this . err ( transformError ( error , onThrow ) ) ,
59- ) ;
60- } catch ( error ) {
61- return this . err ( transformError ( error , onThrow ) ) ;
62- }
63- }
64-
6536 static fromCallable < T , E = unknown > ( callable : SyncFn < T > ) : Result < T , E > ;
6637 static fromCallable < T > ( callable : SyncFn < T > , onThrow : ErrorConstructor ) : Result < T , Error > ;
6738 static fromCallable < T , E > ( callable : SyncFn < T > , onThrow : ( error : unknown ) => E ) : Result < T , E > ;
@@ -79,7 +50,9 @@ export class Result<T = unknown, E = unknown> {
7950 static fromCallable ( callable : unknown , onThrow ?: Fn ) : any {
8051 try {
8152 if ( ! isFunction ( callable ) ) {
82- return this . ok ( callable ) ;
53+ const error = new TypeError ( "Provided argument is not callable" ) ;
54+
55+ return this . err ( transformError ( error , onThrow ) ) ;
8356 }
8457
8558 const data = callable ( ) ;
@@ -96,6 +69,36 @@ export class Result<T = unknown, E = unknown> {
9669 }
9770 }
9871
72+ static toSafeCallable < A extends any [ ] , T , E = unknown > (
73+ callable : SyncFn < T , A > ,
74+ ) : SyncFn < Result < T , E > , A > ;
75+ static toSafeCallable < A extends any [ ] , T > (
76+ callable : SyncFn < T , A > ,
77+ onThrow : ErrorConstructor ,
78+ ) : SyncFn < Result < T , Error > , A > ;
79+ static toSafeCallable < A extends any [ ] , T , E > (
80+ callable : SyncFn < T , A > ,
81+ onThrow : ( error : unknown ) => E ,
82+ ) : SyncFn < Result < T , E > , A > ;
83+
84+ static toSafeCallable < A extends any [ ] , T , E = unknown > (
85+ callable : AsyncFn < T , A > ,
86+ ) : AsyncFn < Result < Awaited < T > , E > , A > ;
87+ static toSafeCallable < A extends any [ ] , T > (
88+ callable : AsyncFn < T , A > ,
89+ onThrowOrReject : ErrorConstructor ,
90+ ) : AsyncFn < Result < Awaited < T > , Error > , A > ;
91+ static toSafeCallable < A extends any [ ] , T , E > (
92+ callable : AsyncFn < T , A > ,
93+ onThrowOrReject : ( error : unknown ) => E ,
94+ ) : AsyncFn < Result < Awaited < T > , E > , A > ;
95+
96+ static toSafeCallable ( callable : unknown , onThrow ?: Fn ) : Fn {
97+ return ( ...args ) => {
98+ return this . fromCallable ( ( ) => ( callable as Fn ) ( ...args ) , onThrow as Fn ) ;
99+ } ;
100+ }
101+
99102 static all < T extends NonEmptyTuple < Result > > ( results : T ) : ResultAll < T > ;
100103 static all < T extends readonly Result [ ] > ( results : T ) : ResultAll < T > ;
101104 static all ( results : Result [ ] ) : ResultAll < Result [ ] > {
0 commit comments