// ArrayList const { clone } = require('../core/util'); // Create a new ArrayList exports.create = function(options, name) { const value = this.parseOptional(options.value, 'object', []); if (!name) throw Error('arraylist.create: name is required.'); if (!this.req.arrays) { this.req.arrays = {}; } this.req.arrays[name] = Array.isArray(value) ? clone(value) : []; }; // Return the ArrayList as array value exports.value = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.value: ref is required.'); if (!this.req.arrays) throw Error('arraylist.value: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.value: ArrayList ${ref} not found.`); return clone(this.req.arrays[ref]); }; // Return the size of the ArrayList exports.size = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.size: ref is required.'); if (!this.req.arrays) throw Error('arraylist.size: No arraylists are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.size: ArrayList ${ref} not found.`); return this.req.arrays[ref].length; }; // Return the value at a specific index exports.get = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.get: ref is required.'); const index = this.parseRequired(options.index, 'number', 'arraylist.get: index is required.'); if (!this.req.arrays) throw Error('arraylist.get: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.get: ArrayList ${ref} not found.`); return clone(this.req.arrays[ref][index]); }; // Add a value to the ArrayList exports.add = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.add: ref is required.'); const value = this.parseRequired(options.value, '*', 'arraylist.add: value is required.'); if (!this.req.arrays) throw Error('arraylist.add: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.add: ArrayList ${ref} not found.`); this.req.arrays[ref].push(clone(value)); }; // Add an array of values to the ArrayList exports.addAll = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.addAll: ref is required.'); const value = this.parseRequired(options.value, 'object', 'arraylist.addAll: value is required.'); if (!this.req.arrays) throw Error('arraylist.addAll: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.addAll: ArrayList ${ref} not found.`); if (!Array.isArray(value)) throw Error('arraylist.addAll: Value must be an array.') for (let val of value) { this.req.arrays[ref].push(clone(val)); } }; // Update a value at a specific index exports.set = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.set: ref is required.'); const index = this.parseRequired(options.index, 'number', 'arraylist.set: index is required.'); const value = this.parseRequired(options.value, '*', 'arraylist.set: value is required.'); if (!this.req.arrays) throw Error('arraylist.set: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.set: ArrayList ${ref} not found.`); this.req.arrays[ref][index] = clone(value); }; // Remove the first occurrence of a specific value exports.remove = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.remove: ref is required.'); const value = this.parseRequired(options.value, '*', 'arraylist.remove: value is required.'); if (!this.req.arrays) throw Error('arraylist.remove: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.remove: ArrayList ${ref} not found.`); const index = this.req.arrays[ref].indexOf(value); if (index == -1) throw Error('arraylist.remove: Value does not exist in the ArrayList.'); this.req.arrays[ref].splice(index, 1); }; // Remove a value from the ArrayList at a specific index exports.removeAt = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.removeAt: ref is required.'); const index = this.parseRequired(options.index, 'number', 'arraylist.removeAt: index is required.'); if (!this.req.arrays) throw Error('arraylist.removeAt: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.removeAt: ArrayList ${ref} not found.`); this.req.arrays[ref].splice(index, 1); }; // Clear all values from the ArrayList exports.clear = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.clear: ref is required.'); if (!this.req.arrays) throw Error('arraylist.clear: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.clear: ArrayList ${ref} not found.`); this.req.arrays[ref] = []; }; // Sort the ArrayList exports.sort = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.sort: ref is required.'); const prop = this.parseOptional(options.prop, 'string', null); const desc = this.parseOptional(options.desc, 'boolean', false); if (!this.req.arrays) throw Error('arraylist.sort: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.sort: ArrayList ${ref} not found.`); this.req.arrays[ref].sort((a, b) => { if (prop) { a = a[prop]; b = b[prop]; } if (a == b) return 0; if (a < b) return desc ? 1 : -1; return desc ? -1 : 1; }); }; // Return the index of the first occurrence of a specific value exports.indexOf = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.indexOf: ref is required.'); const value = this.parseRequired(options.value, '*', 'arraylist.indexOf: value is required.'); if (!this.req.arrays) throw Error('arraylist.indexOf: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.indexOf: ArrayList ${ref} not found.`); return this.req.arrays[ref].indexOf(value); }; // Return true if the ArrayList contains a specific value exports.contains = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.contains: ref is required.'); const value = this.parseRequired(options.value, '*', 'arraylist.contains: value is required.'); if (!this.req.arrays) throw Error('arraylist.contains: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.contains: ArrayList ${ref} not found.`); return this.req.arrays[ref].includes(value); }; // Return true when ArrayList is empty exports.isEmpty = function(options) { const ref = this.parseRequired(options.ref, 'string', 'arraylist.isEmpty: ref is required.'); if (!this.req.arrays) throw Error('arraylist.isEmpty: No ArrayList are created.'); if (!this.req.arrays[ref]) throw Error(`arraylist.isEmpty: ArrayList ${ref} not found.`); return !this.req.arrays[ref].length; };