1 | /**
|
2 | * generates a UID factory
|
3 | * @internal
|
4 | * @example
|
5 | * const uid = generateUID();
|
6 | * uid(object) = 1;
|
7 | * uid(object) = 1;
|
8 | * uid(anotherObject) = 2;
|
9 | */
|
10 | export const generateUID = () => {
|
11 | let counter = 1;
|
12 | const map = new WeakMap();
|
13 | /**
|
14 | * @borrows {uid}
|
15 | */
|
16 | const uid = (item, index) => {
|
17 | if (typeof item === 'number' || typeof item === 'string') {
|
18 | return index ? `idx-${index}` : `val-${item}`;
|
19 | }
|
20 | if (!map.has(item)) {
|
21 | map.set(item, counter++);
|
22 | return uid(item);
|
23 | }
|
24 | return 'uid' + map.get(item);
|
25 | };
|
26 | return uid;
|
27 | };
|
28 | /**
|
29 | * @name uid
|
30 | * returns an UID associated with {item}
|
31 | * @param {Object} item - object to generate UID for
|
32 | * @param {Number} index, a fallback index
|
33 | * @example
|
34 | * uid(object) == 1;
|
35 | * uid(object) == 1;
|
36 | * uid(anotherObject) == 2;
|
37 | * uid("not object", 42) == 42
|
38 | *
|
39 | * @see {@link useUID}
|
40 | */
|
41 | export const uid = generateUID();
|