initial commit

This commit is contained in:
Robin Chappatte
2024-05-21 16:14:58 +02:00
commit 46f08d42cc
3 changed files with 114 additions and 0 deletions

44
dependency-manager.ts Normal file
View File

@@ -0,0 +1,44 @@
type Provider<T> = (manager: DependencyManager) => Promise<T> | T;
type Modules = Map<string, {
provider: Provider<any>;
instance?: any;
}>;
export class DependencyManager {
private modules: Modules = new Map();
private resolving: Set<string> = new Set();
// Enregistrer un module avec son initialisateur
register<T>(name: string, provider: Provider<T>): void {
if (this.modules.has(name)) {
throw new Error(`Module ${name} is already registered.`);
}
this.modules.set(name, { provider });
}
// Résoudre un module et ses dépendances
async resolve<T>(name: string): Promise<T> {
const module = this.modules.get(name);
if (!module) {
throw new Error(`Module ${name} is not registered.`);
}
if (module.instance) {
return module.instance;
}
if (this.resolving.has(name)) {
throw new Error(`Circular dependency detected for module ${name}.`);
}
this.resolving.add(name);
try {
module.instance = await module.provider(this);
return module.instance;
} finally {
this.resolving.delete(name);
}
}
}