Created
December 15, 2020 05:33
-
-
Save joshuaaron/b7602fccf4f514b84a0081181bc352b0 to your computer and use it in GitHub Desktop.
Extended Map & Set
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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