'use strict'; const sjs = require('fast-safe-stringify'); const colour = process.env.NODE_DISABLE_COLORS ? { red: '', yellow: '', green: '', normal: '' } : { red: '\x1b[31m', yellow: '\x1b[33;1m', green: '\x1b[32m', normal: '\x1b[0m' }; function uniqueOnly(value, index, self) { return self.indexOf(value) === index; } function hasDuplicates(array) { return (new Set(array)).size !== array.length; } function allSame(array) { return (new Set(array)).size <= 1; } function deepEquals(obj1, obj2) { function _equals(obj1, obj2) { return sjs.stringify(obj1) === sjs.stringify(Object.assign({}, obj1, obj2)); } return _equals(obj1, obj2) && _equals(obj2, obj1); } function compressArray(arr) { let result = []; for (let candidate of arr) { let dupe = result.find(function(e,i,a){ return deepEquals(e,candidate); }); if (!dupe) result.push(candidate); } return result; } function distinctArray(arr) { return (arr.length === compressArray(arr).length); } function firstDupe(arr) { return arr.find(function(e,i,a){ return arr.indexOf(e)