1*6dbdd20aSAndroid Build Coastguard Worker/* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker// ES6 Set does not allow to reasonably store compound objects; this class 18*6dbdd20aSAndroid Build Coastguard Worker// rectifies the problem by implementing generic set on top of Map and an 19*6dbdd20aSAndroid Build Coastguard Worker// injective function from objects of generic type to strings. 20*6dbdd20aSAndroid Build Coastguard Workerexport class GenericSet<T> { 21*6dbdd20aSAndroid Build Coastguard Worker interner: (t: T) => string; 22*6dbdd20aSAndroid Build Coastguard Worker 23*6dbdd20aSAndroid Build Coastguard Worker // Passed function should be injective (as in never having the same output for 24*6dbdd20aSAndroid Build Coastguard Worker // two different inputs). 25*6dbdd20aSAndroid Build Coastguard Worker constructor(interner: (t: T) => string) { 26*6dbdd20aSAndroid Build Coastguard Worker this.interner = interner; 27*6dbdd20aSAndroid Build Coastguard Worker } 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard Worker backingMap = new Map<string, T>(); 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker has(column: T): boolean { 32*6dbdd20aSAndroid Build Coastguard Worker return this.backingMap.has(this.interner(column)); 33*6dbdd20aSAndroid Build Coastguard Worker } 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker add(column: T) { 36*6dbdd20aSAndroid Build Coastguard Worker this.backingMap.set(this.interner(column), column); 37*6dbdd20aSAndroid Build Coastguard Worker } 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker delete(column: T) { 40*6dbdd20aSAndroid Build Coastguard Worker this.backingMap.delete(this.interner(column)); 41*6dbdd20aSAndroid Build Coastguard Worker } 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Worker values(): Iterable<T> { 44*6dbdd20aSAndroid Build Coastguard Worker return this.backingMap.values(); 45*6dbdd20aSAndroid Build Coastguard Worker } 46*6dbdd20aSAndroid Build Coastguard Worker} 47