arnaucube
arnaucube/circomPublic Self-hosted repository
circom/src/utils.js
src/utils.jsRaw
  1const fnv = require("fnv-plus");
  2
  3module.exports.ident =ident;
  4
  5module.exports.extractSizes =extractSizes;
  6module.exports.flatArray = flatArray;
  7module.exports.csArr = csArr;
  8module.exports.accSizes = accSizes;
  9module.exports.fnvHash = fnvHash;
 10module.exports.sameSizes = sameSizes;
 11module.exports.isDefined = isDefined;
 12module.exports.accSizes2Str = accSizes2Str;
 13module.exports.setUint64 = setUint64;
 14
 15function ident(text) {
 16    if (typeof text === "string") {
 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    } else if (Array.isArray(text)) {
 23        for (let i=0; i<text.length; i++ ) {
 24            text[i] = ident(text[i]);
 25        }
 26        return text;
 27    }
 28}
 29
 30function extractSizes (o) {
 31    if (! Array.isArray(o)) return [];
 32    return [o.length, ...extractSizes(o[0])];
 33}
 34
 35function flatArray(a) {
 36    var res = [];
 37    fillArray(res, a);
 38    return res;
 39
 40    function fillArray(res, a) {
 41        if (Array.isArray(a)) {
 42            for (let i=0; i<a.length; i++) {
 43                fillArray(res, a[i]);
 44            }
 45        } else {
 46            res.push(a);
 47        }
 48    }
 49}
 50
 51// Input [1,2,3]
 52// Returns " ,1 ,2, 3"
 53function csArr(_arr) {
 54    let S = "";
 55    const arr = _arr || [];
 56    for (let i=0; i<arr.length; i++) {
 57        S = " ,"+arr[i];
 58    }
 59    return S;
 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
 75function sameSizes(s1, s2) {
 76    if (!Array.isArray(s1)) return false;
 77    if (!Array.isArray(s2)) return false;
 78    if (s1.length != s2.length) return false;
 79    for (let i=0; i<s1.length; i++) {
 80        if (s1[i] != s2[i]) return false;
 81    }
 82    return true;
 83}
 84
 85function isDefined(v) {
 86    return ((typeof(v) != "undefined")&&(v != null));
 87}
 88
 89function accSizes2Str(sizes) {
 90    if (sizes.length == 2) return "";
 91    return `[${sizes[0]/sizes[1]}]`+accSizes2Str(sizes.slice(1));
 92}
 93
 94function setUint64(buffV, o, n) {
 95    const sLSB = n >>> 0;
 96    const sMSB = (n - sLSB) / 0x100000000;
 97    buffV.setUint32(o, sLSB , true);
 98    buffV.setUint32(o+4, sMSB , true);
 99}
100
101
102
103
104