Skip to content

Commit da87244

Browse files
committed
feat: root arg mandatory and back to weakmap
1 parent dbf3cb5 commit da87244

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

src/model/manager/model-manager.test.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,15 @@ describe('Model manager', () => {
6868
});
6969

7070
test('returns array of instances matching arg', () => {
71-
manager.construct(testClass);
72-
manager.construct(testClass);
73-
manager.construct(testClass1);
74-
expect(manager.getModelInstances(testClass).length).toBe(2);
75-
expect(manager.getModelInstances(testClass1).length).toBe(1);
76-
expect(manager.getModelInstances(testClass2).length).toBe(0);
77-
expect(manager.getModelInstances(testClass, {}).length).toBe(0);
71+
expect(manager.getModelInstances(testClass, {})).toStrictEqual([]);
72+
73+
const instance = manager.construct(testClass);
74+
const instance1 = manager.construct(testClass1, instance);
75+
const instance2 = manager.construct(testClass2, instance1);
76+
expect(manager.getModelInstances(testClass, instance)).toStrictEqual([instance]);
77+
expect(manager.getModelInstances(testClass1, instance)).toStrictEqual([instance1]);
78+
expect(manager.getModelInstances(testClass2, instance)).toStrictEqual([instance2]);
79+
expect(manager.getModelInstances(testClass2, instance1)).toStrictEqual([instance2]);
7880
});
7981

8082
test('allows constructing new models', () => {

src/model/manager/model-manager.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { ModelOnDestroy, ModelOnInit } from './model-lifecycle-hooks';
1313
* models.
1414
*/
1515
export class ModelManager {
16-
private readonly modelInstanceMap: Map<object, ModelInstanceData> = new Map();
16+
private readonly modelInstanceMap: WeakMap<object, ModelInstanceData> = new WeakMap();
1717
private readonly apiBuilders: ModelApiBuilder<ModelApi>[] = [];
1818
private readonly decorators: ModelDecorator[] = [];
1919

@@ -27,10 +27,18 @@ export class ModelManager {
2727
/**
2828
* Returns a shallow copy array of model instances that match the argument model class
2929
*/
30-
public getModelInstances<T extends object>(modelClass: Constructable<T>, root?: object): object[] {
31-
return Array.from(this.modelInstanceMap.keys())
32-
.filter(modelInstance => root === undefined || this.getRoot(modelInstance) === root)
33-
.filter(modelInstance => modelInstance instanceof modelClass);
30+
public getModelInstances<T extends object>(modelClass: Constructable<T>, root: object): object[] {
31+
let found: object[] = [];
32+
33+
if (root instanceof modelClass) {
34+
found = [...found, root];
35+
}
36+
37+
this.modelInstanceMap
38+
.get(root)
39+
?.children.forEach(child => (found = [...found, ...this.getModelInstances(modelClass, child)]));
40+
41+
return found;
3442
}
3543

3644
/**

0 commit comments

Comments
 (0)