/
fast-string-array.ts
38 lines (34 loc) · 1.16 KB
/
fast-string-array.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
export interface FastStringArray {
indexes: { [key: string]: number };
array: readonly string[];
}
/**
* FastStringArray acts like a `Set` (allowing only one occurrence of a string
* `key`), but provides the index of the `key` in the backing array.
*
* This is designed to allow synchronizing a second array with the contents of
* the backing array, like how `sourcesContent[i]` is the source content
* associated with `source[i]`, and there are never duplicates.
*/
export function FastStringArray(): FastStringArray {
return {
indexes: { __proto__: null } as any,
array: [],
};
}
/**
* Puts `key` into the backing array, if it is not already present. Returns
* the index of the `key` in the backing array.
*/
export function put(strarr: FastStringArray, key: string): number {
const { array, indexes } = strarr;
// The key may or may not be present. If it is present, it's a number.
let index = indexes[key] as number | undefined;
// If it's not yet present, we need to insert it and track the index in the
// indexes.
if (index === undefined) {
index = indexes[key] = array.length;
(array as string[]).push(key);
}
return index;
}