11// BASELINE CODE FORKED FROM https://github.com/deebloo/ts-results
22import { toString , wait } from "./util.js" ;
33
4- interface BaseResult < T , E >
5- extends Iterable < T extends Iterable < infer U > ? U : never > {
4+ interface BaseResult < T , E > extends Iterable <
5+ T extends Iterable < infer U > ? U : never
6+ > {
67 /** `true` when the result is Ok */ readonly ok : boolean ;
78 /** `true` when the result is Err */ readonly err : boolean ;
89
@@ -34,6 +35,13 @@ interface BaseResult<T, E>
3435 */
3536 unwrapOr < T2 extends T > ( val : T2 ) : T | T2 ;
3637
38+ /**
39+ * Returns the contained `Ok` value or computes a default from the `Err` value.
40+ *
41+ * (This is the `unwrap_or_else` in rust)
42+ */
43+ unwrapOrElse < T2 extends T > ( op : ( err : E ) => T2 ) : T | T2 ;
44+
3745 /**
3846 * Calls `mapper` if the result is `Ok`, otherwise returns the `Err` value of self.
3947 * This function can be used for control flow based on `Result` values.
@@ -103,6 +111,10 @@ export class Err<E> implements BaseResult<never, E> {
103111 return val ;
104112 }
105113
114+ unwrapOrElse < T2 > ( op : ( err : E ) => T2 ) : T2 {
115+ return op ( this . val ) ;
116+ }
117+
106118 expect ( msg : string ) : never {
107119 throw new Error ( `${ msg } - Error: ${ toString ( this . val ) } \n${ this . #stack} ` ) ;
108120 }
@@ -113,7 +125,7 @@ export class Err<E> implements BaseResult<never, E> {
113125
114126 unwrap ( ) : never {
115127 throw new Error (
116- `Tried to unwrap Error: ${ toString ( this . val ) } \n${ this . #stack} `
128+ `Tried to unwrap Error: ${ toString ( this . val ) } \n${ this . #stack} ` ,
117129 ) ;
118130 }
119131
@@ -165,6 +177,10 @@ export class Ok<T> implements BaseResult<T, never> {
165177 return this . val ;
166178 }
167179
180+ unwrapOrElse ( _op : ( err : never ) => unknown ) : T {
181+ return this . val ;
182+ }
183+
168184 expect ( _msg : string ) : T {
169185 return this . val ;
170186 }
@@ -225,7 +241,7 @@ export namespace Result {
225241 * @param op The operation function
226242 */
227243 export async function wrapAsync < T , E = unknown > (
228- op : ( ) => Promise < T >
244+ op : ( ) => Promise < T > ,
229245 ) : Promise < Result < T , E > > {
230246 try {
231247 return op ( )
@@ -244,7 +260,7 @@ export namespace Result {
244260 */
245261 export async function attempt < T , E > (
246262 cb : ( ) => Promise < Result < T , E > > ,
247- { attempts = 3 , timeout = 1000 , backoff = 0.5 } = { }
263+ { attempts = 3 , timeout = 1000 , backoff = 0.5 } = { } ,
248264 ) {
249265 let count = 1 ;
250266 let waitTime = timeout ;
@@ -272,7 +288,7 @@ export namespace Result {
272288 }
273289
274290 export function isResult < T = any , E = any > (
275- val : unknown
291+ val : unknown ,
276292 ) : val is Result < T , E > {
277293 return val instanceof Err || val instanceof Ok ;
278294 }
0 commit comments