import { Map } from './map'
import { Set } from './set'
/**
* This class is a representation of the Set data structure based on a hash map.
*
* @template K The value type.
* @implements Set<K>
* @property {Map<K, null>} map The map used to store the set.
*/
export abstract class MapSet<K> implements Set<K> {
private map: Map<K, null>
constructor() {
this.map = this.initMap()
}
/**
* Initializes the map used to store the set.
*/
protected abstract initMap(): Map<K, null>
/**
* Adds a new element to the set.
*
* @param value The value to add to the set.
*/
add(value: K): void {
this.map.set(value, null)
}
/**
* Removes an element from the set.
*
* @param value The value to remove from the set.
*/
delete(value: K): void {
this.map.delete(value)
}
/**
* Checks if the set contains a given value.
*
* @param value The value to check for.
* @returns Whether the set contains the value.
*/
has(value: K): boolean {
return this.map.has(value)
}
/**
* Removes all elements from the set.
*/
clear(): void {
this.map.clear()
}
/**
* Returns an array of all the values in the set.
*
* @returns An array of all the values in the set.
*/
values(): K[] {
return this.map.keys()
}
/**
* Returns the number of elements in the set.
*
* @returns The number of elements in the set.
*/
getSize(): number {
return this.map.getSize()
}
}