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 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