Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / docs-shared / lib / Dependency / DependencyContainer.ts
blobe161d9dc165bde8df89cf3a741dd306cf2613f31
1 import { isDeinitable } from './isDeinitable'
3 function isNotUndefined<T>(val: T | undefined | null): val is T {
4   return val != undefined
7 export class DependencyContainer {
8   private factory = new Map<symbol, () => unknown>()
9   private dependencies = new Map<symbol, unknown>()
11   public deinit() {
12     this.factory.clear()
14     const deps = this.getAll()
15     for (const dep of deps) {
16       if (isDeinitable(dep)) {
17         dep.deinit()
18       }
19     }
21     this.dependencies.clear()
22   }
24   public getAll(): unknown[] {
25     return Array.from(this.dependencies.values()).filter(isNotUndefined)
26   }
28   public bind<T>(sym: symbol, maker: () => T) {
29     this.factory.set(sym, maker)
30   }
32   public get<T>(sym: symbol): T {
33     const dep = this.dependencies.get(sym)
34     if (dep) {
35       return dep as T
36     }
38     const maker = this.factory.get(sym)
39     if (!maker) {
40       throw new Error(`No dependency maker found for ${sym.toString()}`)
41     }
43     const instance = maker()
44     if (!instance) {
45       /** Could be optional */
46       return undefined as T
47     }
49     this.dependencies.set(sym, instance)
51     return instance as T
52   }