arnaucube
arnaucube/circomPublic Self-hosted repository
circom/src/utils.js
src/utils.jsRaw
  1const fnv = require("fnv-plus");
  2const bigInt = require("big-integer");
  3
  4module.exports.ident =ident;
  5
  6module.exports.extractSizes =extractSizes;
  7module.exports.flatArray = flatArray;
  8module.exports.csArr = csArr;
  9module.exports.accSizes = accSizes;
 10module.exports.fnvHash = fnvHash;
 11module.exports.stringifyBigInts = stringifyBigInts;
 12module.exports.unstringifyBigInts = unstringifyBigInts;
 13module.exports.sameSizes = sameSizes;
 14module.exports.isDefined = isDefined;
 15module.exports.accSizes2Str = accSizes2Str;
 16
 17function ident(text) {
 18    let lines = text.split("\n");
 19    for (let i=0; i<lines.length; i++) {
 20        if (lines[i]) lines[i] = "    "+lines[i];
 21    }
 22    return lines.join("\n");
 23}
 24
 25function extractSizes (o) {
 26    if (! Array.isArray(o)) return [];
 27    return [o.length, ...extractSizes(o[0])];
 28}
 29
 30function flatArray(a) {
 31    var res = [];
 32    fillArray(res, a);
 33    return res;
 34
 35    function fillArray(res, a) {
 36        if (Array.isArray(a)) {
 37            for (let i=0; i<a.length; i++) {
 38                fillArray(res, a[i]);
 39            }
 40        } else {
 41            res.push(bigInt(a));
 42        }
 43    }
 44}
 45
 46// Input [1,2,3]
 47// Returns " ,1 ,2, 3"
 48function csArr(_arr) {
 49    let S = "";
 50    const arr = _arr || [];
 51    for (let i=0; i<arr.length; i++) {
 52        S = " ,"+arr[i];
 53    }
 54    return S;
 55}
 56
 57function accSizes(_sizes) {
 58    const sizes = _sizes || [];
 59    const accSizes = [1, 0];
 60    for (let i=sizes.length-1; i>=0; i--) {
 61        accSizes.unshift(accSizes[0]*sizes[i]);
 62    }
 63    return accSizes;
 64}
 65
 66function fnvHash(str) {
 67    return fnv.hash(str, 64).hex();
 68}
 69
 70
 71
 72function stringifyBigInts(o) {
 73    if ((typeof(o) == "bigint") || o.isZero !== undefined)  {
 74        return o.toString(10);
 75    } else if (Array.isArray(o)) {
 76        return o.map(stringifyBigInts);
 77    } else if (typeof o == "object") {
 78        const res = {};
 79        for (let k in o) {
 80            res[k] = stringifyBigInts(o[k]);
 81        }
 82        return res;
 83    } else {
 84        return o;
 85    }
 86}
 87
 88
 89
 90function unstringifyBigInts(o) {
 91    if ((typeof(o) == "string") && (/^[0-9]+$/.test(o) ))  {
 92        return bigInt(o);
 93    } else if (Array.isArray(o)) {
 94        return o.map(unstringifyBigInts);
 95    } else if (typeof o == "object") {
 96        const res = {};
 97        for (let k in o) {
 98            res[k] = unstringifyBigInts(o[k]);
 99        }
100        return res;
101    } else {
102        return bigInt(o);
103    }
104}
105
106function sameSizes(s1, s2) {
107    if (!Array.isArray(s1)) return false;
108    if (!Array.isArray(s2)) return false;
109    if (s1.length != s2.length) return false;
110    for (let i=0; i<s1.length; i++) {
111        if (s1[i] != s2[i]) return false;
112    }
113    return true;
114}
115
116function isDefined(v) {
117    return ((typeof(v) != "undefined")&&(v != null));
118}
119
120function accSizes2Str(sizes) {
121    if (sizes.length == 2) return "";
122    return `[${sizes[0]/sizes[1]}]`+accSizes2Str(sizes.slice(1));
123}
124
125
126
127