'use strict'; export function create(obj, proto=Object.prototype) { const props = Object.keys(obj) .map((key) => [ key, { value: obj[key], enumerable: true } ]) .reduce((acc, [ key, value ]) => ({ ...acc, [key]: value }), {}); return Object.create(proto, props); }; export function random_choice(collection, r=Math.random()) { const idx = Math.floor(collection.length * r); return collection[idx]; } export function pairs(arr1, arr2) { return arr1 .map((x, i) => arr2.map(y => [x, y])) .flat(); } export function deepEqual(a, b, debug=false) { if (typeof(a) === 'object') { if (typeof(b) === 'object') { // do deep equality return [...new Set(Object.keys(a).concat(Object.keys(b)))].reduce( (acc, key) => { return acc && deepEqual(a[key], b[key]); }, true ); } else { // one object, one non-object return false; } } else { return a === b; } } export function apply(f, n, x0) { if (n == 0) { return x0; } else { return f(apply(f, n-1, x0)); } }