Skip to content

Instantly share code, notes, and snippets.

@joshuaaron
Created December 15, 2020 05:33
Show Gist options
  • Save joshuaaron/b7602fccf4f514b84a0081181bc352b0 to your computer and use it in GitHub Desktop.
Save joshuaaron/b7602fccf4f514b84a0081181bc352b0 to your computer and use it in GitHub Desktop.
Extended Map & Set
class ExtendedMap<K, V> extends Map<K, V> {
update(key: K, updater: (value: V, key: K) => V, reset: V = undefined) {
if (this.has(key)) {
this.set(key, updater(this.get(key), key));
}
else this.set(key, reset);
}
filter(predicate: (value: V, key: K) => boolean) {
const newMap = new ExtendedMap<K, V>();
const entries = [...this.entries()]
for (const [key, value] of entries) {
if (predicate(value, key)) newMap.set(key, value);
}
return newMap
}
merge(map: Map<K, V>, resolver: (key: K, currentValue: V, outsideValue: V) => V = (k, v, outsideValue) => outsideValue) {
const entries = [...map.entries()];
for (const [key, value] of entries) {
if (this.has(key)) {
this.set(key, resolver(key, this.get(key), value));
}
else this.set(key, value)
}
}
}
class ExtendedSet<V> extends Set<V> {
filter(predicate: (value: V) => boolean) {
const newSet = new ExtendedSet<V>();
const entries = [...this.entries()];
for (const [value] of entries) {
if (predicate(value)) {
newSet.add(value);
}
}
return newSet;
}
merge(set: Set<V>) {
const entries = [...set.entries()];
for (const kv of entries) {
this.add(kv[0]);
}
}
except(set: Set<V>) {
const newSet = new ExtendedSet<V>();
const entries = [...set.entries()];
for (const [value] of entries) {
if (!this.has(value)) {
newSet.add(value)
}
}
return newSet;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment