|
|
const fnv = require("fnv-plus"); const bigInt = require("big-integer");
module.exports.ident =ident;
module.exports.extractSizes =extractSizes; module.exports.flatArray = flatArray; module.exports.csArr = csArr; module.exports.accSizes = accSizes; module.exports.fnvHash = fnvHash; module.exports.stringifyBigInts = stringifyBigInts; module.exports.unstringifyBigInts = unstringifyBigInts; module.exports.sameSizes = sameSizes; module.exports.isDefined = isDefined; module.exports.accSizes2Str = accSizes2Str;
function ident(text) { if (typeof text === "string") { let lines = text.split("\n"); for (let i=0; i<lines.length; i++) { if (lines[i]) lines[i] = " "+lines[i]; } return lines.join("\n"); } else if (Array.isArray(text)) { for (let i=0; i<text.length; i++ ) { text[i] = ident(text[i]); } return text; } }
function extractSizes (o) { if (! Array.isArray(o)) return []; return [o.length, ...extractSizes(o[0])]; }
function flatArray(a) { var res = []; fillArray(res, a); return res;
function fillArray(res, a) { if (Array.isArray(a)) { for (let i=0; i<a.length; i++) { fillArray(res, a[i]); } } else { res.push(bigInt(a)); } } }
// Input [1,2,3]
// Returns " ,1 ,2, 3"
function csArr(_arr) { let S = ""; const arr = _arr || []; for (let i=0; i<arr.length; i++) { S = " ,"+arr[i]; } return S; }
function accSizes(_sizes) { const sizes = _sizes || []; const accSizes = [1, 0]; for (let i=sizes.length-1; i>=0; i--) { accSizes.unshift(accSizes[0]*sizes[i]); } return accSizes; }
function fnvHash(str) { return fnv.hash(str, 64).hex(); }
function stringifyBigInts(o) { if ((typeof(o) == "bigint") || o.eq !== undefined) { return o.toString(10); } else if (Array.isArray(o)) { return o.map(stringifyBigInts); } else if (typeof o == "object") { const res = {}; for (let k in o) { res[k] = stringifyBigInts(o[k]); } return res; } else { return o; } }
function unstringifyBigInts(o) { if ((typeof(o) == "string") && (/^[0-9]+$/.test(o) )) { return bigInt(o); } else if (Array.isArray(o)) { return o.map(unstringifyBigInts); } else if (typeof o == "object") { const res = {}; for (let k in o) { res[k] = unstringifyBigInts(o[k]); } return res; } else { return bigInt(o); } }
function sameSizes(s1, s2) { if (!Array.isArray(s1)) return false; if (!Array.isArray(s2)) return false; if (s1.length != s2.length) return false; for (let i=0; i<s1.length; i++) { if (s1[i] != s2[i]) return false; } return true; }
function isDefined(v) { return ((typeof(v) != "undefined")&&(v != null)); }
function accSizes2Str(sizes) { if (sizes.length == 2) return ""; return `[${sizes[0]/sizes[1]}]`+accSizes2Str(sizes.slice(1)); }
|