Actually included the file

merge-requests/1/merge
Bsian 2019-10-31 20:11:20 +00:00
parent 71053df288
commit 01232279ac
No known key found for this signature in database
GPG Key ID: 097FB9A291026091
1 changed files with 188 additions and 0 deletions

188
src/class/Collection.ts Normal file
View File

@ -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}>]`;
}
}