-
Notifications
You must be signed in to change notification settings - Fork 1
/
intcodec.js
41 lines (36 loc) · 1 KB
/
intcodec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// "Codec" is for "co[der-]dec[oder]".
const CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=';
export const encodeInteger = (z) => {
if (!Number.isSafeInteger(z))
throw new Error(`${z} is not a safe integer`);
let result = '';
if (z < 0) {
result += '-';
z = -z;
}
while (z) {
const digit = z & 63;
result += CHARS[digit];
z -= digit;
z /= 64;
}
return result;
};
export const encodeManyIntegers = (zs) => zs.map(encodeInteger).join(',');
export const decodeInteger = (s) => {
let i = 0;
let negative = false;
if (i < s.length && s[i] === '-') {
negative = true;
++i;
}
let z = 0;
for (let shift = 1; i < s.length; ++i, shift *= 64) {
const digit = CHARS.indexOf(s[i]);
if (digit === -1)
return NaN;
z += digit * shift;
}
return negative ? -z : z;
};
export const decodeManyIntegers = (s) => s.split(',').map(decodeInteger);