You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
587 B
32 lines
587 B
export enum LazyStatus { |
|
Pending, |
|
Resolved, |
|
Error, |
|
} |
|
|
|
export class Lazy<T> { |
|
#value?: T; |
|
#resolver: () => Promise<T>; |
|
|
|
status: LazyStatus; |
|
|
|
constructor(resolver: () => Promise<T>) { |
|
this.#resolver = resolver; |
|
this.status = LazyStatus.Pending; |
|
} |
|
|
|
async value(): Promise<T | null> { |
|
if (!this.#value) { |
|
try { |
|
this.#value = await this.#resolver(); |
|
} catch (error) { |
|
this.status = LazyStatus.Error; |
|
console.error(error); |
|
return null; |
|
} |
|
} |
|
|
|
this.status = LazyStatus.Resolved; |
|
return this.#value; |
|
} |
|
} |