/
managers.ts
39 lines (30 loc) · 1.03 KB
/
managers.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { Owner } from '@ember/-internals/owner';
import { Dict, Opaque } from '@glimmer/interfaces';
import { CapturedArguments } from '@glimmer/runtime';
const MANAGERS: WeakMap<any, ManagerFactory<Opaque>> = new WeakMap();
const getPrototypeOf = Object.getPrototypeOf;
export type ManagerFactory<ManagerDelegate> = (owner: Owner) => ManagerDelegate;
export function setManager<ManagerDelegate>(factory: ManagerFactory<ManagerDelegate>, obj: any) {
MANAGERS.set(obj, factory);
return obj;
}
export function getManager<T>(obj: any): undefined | ManagerFactory<T> {
let pointer = obj;
while (pointer !== undefined && pointer !== null) {
if (MANAGERS.has(pointer)) {
return MANAGERS.get(pointer) as ManagerFactory<T>;
}
pointer = getPrototypeOf(pointer);
}
return;
}
export function valueForCapturedArgs(args: CapturedArguments): ManagerArgs {
return {
named: args.named.value(),
positional: args.positional.value(),
};
}
export interface ManagerArgs {
named: Dict<Opaque>;
positional: Opaque[];
}