Refactor card.ts substantially and test.

This commit is contained in:
Dermot Duffy
2023-10-02 16:30:05 -07:00
parent 4cf13b1645
commit bfdbe70d6c
92 changed files with 8404 additions and 2996 deletions
+69
View File
@@ -0,0 +1,69 @@
import { allPromises } from '../basic';
enum InitializationState {
INITIALIZING = 'initializing',
INITIALIZED = 'initialized',
}
type InitializationCallback = () => Promise<unknown>;
/**
* Manages initialization state & calling initializers.
*/
export class Initializer {
protected _state: Map<string, InitializationState>;
constructor() {
this._state = new Map();
}
public async initializeMultipleIfNecessary(
aspects: Record<string, InitializationCallback>,
): Promise<boolean> {
const results = await allPromises(
Object.entries(aspects),
async ([aspect, options]) => this.initializeIfNecessary(aspect, options),
);
return results.every(Boolean);
}
/**
*
* @param aspect The aspect to initialize.
* @param initializer The initializer to call.
* @returns `true` if the state is confirmed as initialized, `false`
* otherwise (i.e. initializing).
*/
public async initializeIfNecessary(
aspect: string,
initializer?: InitializationCallback,
): Promise<boolean> {
const state = this._state.get(aspect);
if (state !== InitializationState.INITIALIZED) {
if (state !== InitializationState.INITIALIZING) {
if (initializer) {
this._state.set(aspect, InitializationState.INITIALIZING);
await initializer();
this._state.set(aspect, InitializationState.INITIALIZED);
} else {
this._state.set(aspect, InitializationState.INITIALIZED);
}
return true;
}
return false;
}
return true;
}
public uninitialize(aspect: string) {
return this._state.delete(aspect);
}
public isInitialized(aspect: string): boolean {
return this._state.get(aspect) == InitializationState.INITIALIZED;
}
public isInitializedMultiple(aspects: string[]): boolean {
return aspects.every((aspect) => this.isInitialized(aspect));
}
}