All files / core/util CountedSet.ts

81.48% Statements 22/27
50% Branches 2/4
75% Functions 9/12
80% Lines 20/25
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100                                13x             13x 25x           13x 46x             13x 157x             13x 77x           13x 20x           13x               13x 6x           13x 63x             13x 8x             13x             13x  
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { isEmpty, getCount, forEach, contains } from '@firebase/util';
 
/**
 * Implements a set with a count of elements.
 *
 * @template K, V
 */
export class CountedSet<K, V> {
  set: { [k: string]: V } = {};
 
  /**
   * @param {!K} item
   * @param {V} val
   */
  add(item: K, val: V) {
    this.set[item as any] = val !== null ? val : (true as any);
  }
 
  /**
   * @param {!K} key
   * @return {boolean}
   */
  contains(key: K) {
    return contains(this.set, key);
  }
 
  /**
   * @param {!K} item
   * @return {V}
   */
  get(item: K): V | void {
    return this.contains(item) ? this.set[item as any] : undefined;
  }
 
  /**
   * @param {!K} item
   */
  remove(item: K) {
    delete this.set[item as any];
  }
 
  /**
   * Deletes everything in the set
   */
  clear() {
    this.set = {};
  }
 
  /**
   * True if there's nothing in the set
   * @return {boolean}
   */
  isEmpty(): boolean {
    return isEmpty(this.set);
  }
 
  /**
   * @return {number} The number of items in the set
   */
  count(): number {
    return getCount(this.set);
  }
 
  /**
   * Run a function on each k,v pair in the set
   * @param {function(K, V)} fn
   */
  each(fn: (k: K, v: V) => void) {
    forEach(this.set, (k: K, v: V) => fn(k, v));
  }
 
  /**
   * Mostly for debugging
   * @return {Array.<K>} The keys present in this CountedSet
   */
  keys(): K[] {
    const keys: K[] = [];
    forEach(this.set, (k: K) => {
      keys.push(k);
    });
    return keys;
  }
}