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;
13
14function ident(text) {
15    if (typeof text === "string") {
16        let lines = text.split("\n");
17        for (let i=0; i<lines.length; i++) {
18            if (lines[i]) lines[i] = "    "+lines[i];
19        }
20        return lines.join("\n");
21    } else if (Array.isArray(text)) {
22        for (let i=0; i<text.length; i++ ) {
23            text[i] = ident(text[i]);
24        }
25        return text;
26    }
27}
28
29function extractSizes (o) {
30    if (! Array.isArray(o)) return [];
31    return [o.length, ...extractSizes(o[0])];
32}
33
34function flatArray(a) {
35    var res = [];
36    fillArray(res, a);
37    return res;
38
39    function fillArray(res, a) {
40        if (Array.isArray(a)) {
41            for (let i=0; i<a.length; i++) {
42                fillArray(res, a[i]);
43            }
44        } else {
45            res.push(a);
46        }
47    }
48}
49
50// Input [1,2,3]
51// Returns " ,1 ,2, 3"
52function csArr(_arr) {
53    let S = "";
54    const arr = _arr || [];
55    for (let i=0; i<arr.length; i++) {
56        S = " ,"+arr[i];
57    }
58    return S;
59}
60
61function accSizes(_sizes) {
62    const sizes = _sizes || [];
63    const accSizes = [1, 0];
64    for (let i=sizes.length-1; i>=0; i--) {
65        accSizes.unshift(accSizes[0]*sizes[i]);
66    }
67    return accSizes;
68}
69
70function fnvHash(str) {
71    return fnv.hash(str, 64).hex();
72}
73
74function sameSizes(s1, s2) {
75    if (!Array.isArray(s1)) return false;
76    if (!Array.isArray(s2)) return false;
77    if (s1.length != s2.length) return false;
78    for (let i=0; i<s1.length; i++) {
79        if (s1[i] != s2[i]) return false;
80    }
81    return true;
82}
83
84function isDefined(v) {
85    return ((typeof(v) != "undefined")&&(v != null));
86}
87
88function accSizes2Str(sizes) {
89    if (sizes.length == 2) return "";
90    return `[${sizes[0]/sizes[1]}]`+accSizes2Str(sizes.slice(1));
91}
92
93
94
95