@@ -19,12 +19,12 @@ export function resource(fn) {
1919
2020/**
2121 * @template T
22- * @implements {Partial<Promise<Awaited<T> >>}
22+ * @implements {Partial<Promise<T >>}
2323 */
2424class Resource {
2525 #init = false ;
2626
27- /** @type {() => T } */
27+ /** @type {() => T | Promise<T> } */
2828 #fn;
2929
3030 /** @type {Source<boolean> } */
@@ -36,42 +36,19 @@ class Resource {
3636 /** @type {Source<boolean> } */
3737 #ready = state ( false ) ;
3838
39- /** @type {Source<Awaited<T> | undefined> } */
39+ /** @type {Source<T | undefined> } */
4040 #raw = state ( undefined ) ;
4141
42- /** @type {Source<Promise<any >> } */
42+ /** @type {Source<Promise<T >> } */
4343 #promise;
4444
45- /** @type {Derived<Awaited<T> | undefined> } */
46- #current = derived ( ( ) => {
47- if ( ! get ( this . #ready) ) return undefined ;
48- return get ( this . #raw) ;
49- } ) ;
50-
5145 /** {@type Source<any> } */
5246 #error = state ( undefined ) ;
5347
54- /** @type {Derived<Promise<Awaited<T>>['then']> } */
55- // @ts -expect-error - I feel this might actually be incorrect but I can't prove it yet.
56- // we are technically not returning a promise that resolves to the correct type... but it _is_ a promise that resolves at the correct time
48+ /** @type {Derived<Promise<T>['then']> } */
5749 #then = derived ( ( ) => {
5850 const p = get ( this . #promise) ;
59-
60- return async ( resolve , reject ) => {
61- const result = /** @type {Promise<Awaited<T>> } */ (
62- ( async ( ) => {
63- await p ;
64- await tick ( ) ;
65- return get ( this . #current) ;
66- } ) ( )
67- ) ;
68-
69- if ( resolve || reject ) {
70- return result . then ( resolve , reject ) ;
71- }
72-
73- return result ;
74- } ;
51+ return ( resolve , reject ) => p . then ( resolve , reject ) ;
7552 } ) ;
7653
7754 /**
@@ -92,6 +69,7 @@ class Resource {
9269 this . #init = true ;
9370 }
9471
72+ /** @type {ReturnType<typeof deferred<T>> } */
9573 const { resolve, reject, promise } = deferred ( ) ;
9674
9775 this . #latest. push ( resolve ) ;
@@ -108,7 +86,7 @@ class Resource {
10886 set ( this . #raw, value ) ;
10987 set ( this . #error, undefined ) ;
11088
111- resolve ( undefined ) ;
89+ resolve ( value ) ;
11290 } )
11391 . catch ( ( e ) => {
11492 const idx = this . #latest. indexOf ( resolve ) ;
@@ -137,12 +115,12 @@ class Resource {
137115 get finally ( ) {
138116 get ( this . #then) ;
139117 return ( /** @type {any } */ fn ) => {
140- return get ( this . #then) ( ) . finally ( fn ) ;
118+ return get ( this . #then) ( fn , fn ) ;
141119 } ;
142120 }
143121
144122 get current ( ) {
145- return get ( this . #current ) ;
123+ return get ( this . #ready ) ? get ( this . #raw ) : undefined ;
146124 }
147125
148126 get error ( ) {
@@ -173,13 +151,13 @@ class Resource {
173151 } ;
174152
175153 /**
176- * @param {Awaited<T> } value
154+ * @param {T } value
177155 */
178156 set = ( value ) => {
179157 set ( this . #ready, true ) ;
180158 set ( this . #loading, false ) ;
181159 set ( this . #error, undefined ) ;
182160 set ( this . #raw, value ) ;
183- set ( this . #promise, Promise . resolve ( ) ) ;
161+ set ( this . #promise, Promise . resolve ( value ) ) ;
184162 } ;
185163}
0 commit comments