Actually included the file
parent
71053df288
commit
01232279ac
|
@ -0,0 +1,188 @@
|
|||
/**
|
||||
* Hold a bunch of something
|
||||
*/
|
||||
export default class Collection<V> extends Map<string, V> {
|
||||
baseObject: any
|
||||
|
||||
iterable: any[]|object
|
||||
|
||||
/**
|
||||
* Creates an instance of Collection
|
||||
*/
|
||||
constructor({ base: baseObject = null, iterable = null }) {
|
||||
if (iterable && iterable instanceof Array) {
|
||||
// @ts-ignore
|
||||
super(iterable);
|
||||
} else if (iterable && iterable instanceof Object) {
|
||||
// @ts-ignore
|
||||
super(Object.entries(iterable));
|
||||
} else {
|
||||
super();
|
||||
}
|
||||
this.baseObject = baseObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map to array
|
||||
* ```js
|
||||
* [value, value, value]
|
||||
* ```
|
||||
*/
|
||||
toArray(): V[] {
|
||||
return [...this.values()];
|
||||
}
|
||||
|
||||
/**
|
||||
* Map to object
|
||||
* ```js
|
||||
* { key: value, key: value, key: value }
|
||||
* ```
|
||||
*/
|
||||
toObject(): object {
|
||||
const obj: object = {};
|
||||
for (const [key, value] of this.entries()) {
|
||||
obj[key] = value;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an object
|
||||
*
|
||||
* If baseObject, add only if instance of baseObject
|
||||
*
|
||||
* If no baseObject, add
|
||||
* @param key The key of the object
|
||||
* @param value The object data
|
||||
* @param replace Whether to replace an existing object with the same key
|
||||
* @return The existing or newly created object
|
||||
*/
|
||||
add(key: string, value: V, replace: boolean = false): V {
|
||||
if (this.has(key) && !replace) {
|
||||
return this.get(key);
|
||||
}
|
||||
if (this.baseObject && !(value instanceof this.baseObject)) return null;
|
||||
|
||||
this.set(key, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the first object to make the function evaluate true
|
||||
* @param func A function that takes an object and returns something
|
||||
* @return The first matching object, or `null` if no match
|
||||
*/
|
||||
find(func: Function): V {
|
||||
for (const item of this.values()) {
|
||||
if (func(item)) return item;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array with the results of applying the given function to each element
|
||||
* @param func A function that takes an object and returns something
|
||||
*/
|
||||
map(func: Function) {
|
||||
const arr = [];
|
||||
for (const item of this.values()) {
|
||||
arr.push(func(item));
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all the objects that make the function evaluate true
|
||||
* @param func A function that takes an object and returns true if it matches
|
||||
*/
|
||||
filter(func: Function): V[] {
|
||||
const arr = [];
|
||||
for (const item of this.values()) {
|
||||
if (func(item)) {
|
||||
arr.push(item);
|
||||
}
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduce values by function
|
||||
* @param callbackFn Function to execute on each element in the array
|
||||
* @param initialValue Value to use as the first argument to the first call of the callback
|
||||
* @returns Accumulator
|
||||
*/
|
||||
reduce(func: Function, initialValue = 0) {
|
||||
const iter = this.values();
|
||||
let val;
|
||||
let result = initialValue === undefined ? iter.next().value : initialValue;
|
||||
while ((val = iter.next().value) !== undefined) { // eslint-disable-line
|
||||
result = func(result, val);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if at least one element passes the test implemented by the provided function. Returns true if yes, or false if not.
|
||||
* @param func A function that takes an object and returns true if it matches
|
||||
*/
|
||||
some(func: Function) {
|
||||
for (const item of this.values()) {
|
||||
if (func(item)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if all elements passe the test implemented by the provided function. Returns true if yes, or false if not.
|
||||
* @param func A function that takes an object and returns true if it matches
|
||||
* @returns An array containing booleans that matched
|
||||
*/
|
||||
every(func: Function): boolean[] {
|
||||
const array = [];
|
||||
for (const item of this.values()) {
|
||||
if (func(item)) array.push(true);
|
||||
else array.push(false);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update an object
|
||||
* @param key The key of the object
|
||||
* @param value The updated object data
|
||||
*/
|
||||
update(key: string, value: V) {
|
||||
return this.add(key, value, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an object
|
||||
* @param key The key of the object
|
||||
* @returns The removed object, or `null` if nothing was removed
|
||||
*/
|
||||
remove(key): V {
|
||||
const item = this.get(key);
|
||||
if (!item) {
|
||||
return null;
|
||||
}
|
||||
this.delete(key);
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random object from the Collection
|
||||
* @returns The random object or `null` if empty
|
||||
*/
|
||||
random(): V {
|
||||
if (!this.size) {
|
||||
return null;
|
||||
}
|
||||
return Array.from(this.values())[Math.floor(Math.random() * this.size)];
|
||||
}
|
||||
|
||||
toString() {
|
||||
return `[Collection<${this.baseObject.name}>]`;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue