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