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