1
+ export default class ArrayStringMap < K extends any [ ] , V > implements Map < K , V > {
2
+ private readonly _map : Map < string , V > = new Map < string , V > ( ) ;
3
+ private readonly _converterInfo : Map < string , K > = new Map < string , K > ( ) ;
4
+ private readonly _sep : string ;
5
+
6
+ public constructor ( sep : string = '\u200b' ) {
7
+ this . _sep = sep ;
8
+ }
9
+
10
+
11
+ public get sep ( ) : string {
12
+ return this . _sep ;
13
+ }
14
+
15
+ public get [ Symbol . toStringTag ] ( ) : string {
16
+ return "ArrayStringMap" ;
17
+ }
18
+
19
+ public get size ( ) : number {
20
+ return this . _map . size ;
21
+ }
22
+
23
+ private encodeArray ( arr : K ) : string {
24
+ return arr . map ( x => x . toString ( ) ) . join ( this . _sep )
25
+ }
26
+
27
+
28
+ [ Symbol . iterator ] ( ) : IterableIterator < [ K , V ] > {
29
+ return this . entries ( ) ;
30
+ }
31
+
32
+ clear ( ) : void {
33
+ this . _map . clear ( ) ;
34
+ this . _converterInfo . clear ( ) ;
35
+ }
36
+
37
+ delete ( key : K ) : boolean {
38
+ return false ;
39
+ }
40
+
41
+ * entries ( ) : IterableIterator < [ K , V ] > {
42
+ for ( const [ key , value ] of this . _map . entries ( ) ) {
43
+ // TypeScript complains that this will be undefined, but the items in
44
+ // `this._converterInfo` and `this._map` will always be defined in each other.
45
+ const arr : K = this . _converterInfo . get ( key ) as K ;
46
+ yield [ arr , value ] ;
47
+ }
48
+ }
49
+
50
+ forEach ( callbackfn : ( value : V , key : K , map : Map < K , V > ) => void , thisArg ?: any ) : void {
51
+ this . _converterInfo . forEach ( ( value , key ) => {
52
+ // TypeScript complains that this will be undefined, but the items in
53
+ // `this._converterInfo` and `this._map` will always be defined in each other.
54
+ return callbackfn ( this . _map . get ( key ) ! , value , thisArg ) ;
55
+ } ) ;
56
+ }
57
+
58
+ get ( key : K ) : V | undefined {
59
+ return this . _map . get ( this . encodeArray ( key ) ) ;
60
+ }
61
+
62
+ has ( key : K ) : boolean {
63
+ return this . _map . has ( this . encodeArray ( key ) ) ;
64
+ }
65
+
66
+ keys ( ) : IterableIterator < K > {
67
+ return this . _converterInfo . values ( ) ;
68
+ }
69
+
70
+ set ( key : K , value : V ) : this {
71
+ const encodedKey = this . encodeArray ( key ) ;
72
+ this . _map . set ( encodedKey , value ) ;
73
+ this . _converterInfo . set ( encodedKey , key ) ;
74
+ return this ;
75
+ }
76
+
77
+ values ( ) : IterableIterator < V > {
78
+ return this . _map . values ( ) ;
79
+ }
80
+
81
+ }
0 commit comments