UNPKG

ts2fable

Version:

TypeScript definition files parser for fable-compiler

1,914 lines (1,575 loc) 351 kB
#!/usr/bin/env node (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('path'), require('fs'), require('typescript')) : typeof define === 'function' && define.amd ? define(['exports', 'path', 'fs', 'typescript'], factory) : (global = global || self, factory(global.ts2fable = {}, global.path$$1, global.fs, global.typescript)); }(this, (function (exports, path$$1, fs, typescript) { 'use strict'; // tslint:disable:ban-types function isDisposable(x) { return x != null && typeof x.Dispose === "function"; } function tryGetValue(map, key, defaultValue) { return map.has(key) ? [true, map.get(key)] : [false, defaultValue]; } function addToSet(v, set) { if (set.has(v)) { return false; } set.add(v); return true; } class Lazy { constructor(factory) { this.factory = factory; this.isValueCreated = false; } get Value() { if (!this.isValueCreated) { this.createdValue = this.factory(); this.isValueCreated = true; } return this.createdValue; } get IsValueCreated() { return this.isValueCreated; } } function dateOffset(date) { const date1 = date; return typeof date1.offset === "number" ? date1.offset : date.kind === 1 /* UTC */ ? 0 : date.getTimezoneOffset() * -60000; } function int32ToString(i, radix) { i = i < 0 && radix != null && radix !== 10 ? 0xFFFFFFFF + i + 1 : i; return i.toString(radix); } class ObjectRef { static id(o) { if (!ObjectRef.idMap.has(o)) { ObjectRef.idMap.set(o, ++ObjectRef.count); } return ObjectRef.idMap.get(o); } } ObjectRef.idMap = new WeakMap(); ObjectRef.count = 0; function stringHash(s) { let i = 0; let h = 5381; const len = s.length; while (i < len) { h = h * 33 ^ s.charCodeAt(i++); } return h; } function numberHash(x) { return x * 2654435761 | 0; } // From https://stackoverflow.com/a/37449594 function combineHashCodes(hashes) { if (hashes.length === 0) { return 0; } return hashes.reduce((h1, h2) => { return (h1 << 5) + h1 ^ h2; }); } function identityHash(x) { if (x == null) { return 0; } switch (typeof x) { case "boolean": return x ? 1 : 0; case "number": return numberHash(x); case "string": return stringHash(x); default: return numberHash(ObjectRef.id(x)); } } function structuralHash(x) { if (x == null) { return 0; } switch (typeof x) { case "boolean": return x ? 1 : 0; case "number": return numberHash(x); case "string": return stringHash(x); default: { if (typeof x.GetHashCode === "function") { return x.GetHashCode(); } else if (isArray(x)) { const ar = x; const len = ar.length; const hashes = new Array(len); for (let i = 0; i < len; i++) { hashes[i] = structuralHash(ar[i]); } return combineHashCodes(hashes); } else { return stringHash(String(x)); } } } } function isArray(x) { return Array.isArray(x) || ArrayBuffer.isView(x); } function equalArraysWith(x, y, eq) { if (x == null) { return y == null; } if (y == null) { return false; } if (x.length !== y.length) { return false; } for (let i = 0; i < x.length; i++) { if (!eq(x[i], y[i])) { return false; } } return true; } function equalArrays(x, y) { return equalArraysWith(x, y, equals); } // export function equalObjects(x: { [k: string]: any }, y: { [k: string]: any }): boolean { // if (x == null) { return y == null; } // if (y == null) { return false; } // const xKeys = Object.keys(x); // const yKeys = Object.keys(y); // if (xKeys.length !== yKeys.length) { // return false; // } // xKeys.sort(); // yKeys.sort(); // for (let i = 0; i < xKeys.length; i++) { // if (xKeys[i] !== yKeys[i] || !equals(x[xKeys[i]], y[yKeys[i]])) { // return false; // } // } // return true; // } function equals(x, y) { if (x === y) { return true; } else if (x == null) { return y == null; } else if (y == null) { return false; } else if (typeof x !== "object") { return false; } else if (typeof x.Equals === "function") { return x.Equals(y); } else if (isArray(x)) { return isArray(y) && equalArrays(x, y); } else if (x instanceof Date) { return y instanceof Date && compareDates(x, y) === 0; } else { return false; } } function compareDates(x, y) { let xtime; let ytime; // DateTimeOffset and DateTime deals with equality differently. if ("offset" in x && "offset" in y) { xtime = x.getTime(); ytime = y.getTime(); } else { xtime = x.getTime() + dateOffset(x); ytime = y.getTime() + dateOffset(y); } return xtime === ytime ? 0 : xtime < ytime ? -1 : 1; } function comparePrimitives(x, y) { return x === y ? 0 : x < y ? -1 : 1; } function compareArraysWith(x, y, comp) { if (x == null) { return y == null ? 0 : 1; } if (y == null) { return -1; } if (x.length !== y.length) { return x.length < y.length ? -1 : 1; } for (let i = 0, j = 0; i < x.length; i++) { j = comp(x[i], y[i]); if (j !== 0) { return j; } } return 0; } function compareArrays(x, y) { return compareArraysWith(x, y, compare); } function compare(x, y) { if (x === y) { return 0; } else if (x == null) { return y == null ? 0 : -1; } else if (y == null) { return 1; } else if (typeof x !== "object") { return x < y ? -1 : 1; } else if (typeof x.CompareTo === "function") { return x.CompareTo(y); } else if (isArray(x)) { return isArray(y) && compareArrays(x, y); } else if (x instanceof Date) { return y instanceof Date && compareDates(x, y); } else { return 1; } } // or Dictionaries so we need a runtime check (see #1120) function count(col) { if (isArray(col)) { return col.length; } else { let count = 0; for (const _ of col) { count++; } return count; } } const CURRIED_KEY = "__CURRIED__"; function partialApply(arity, f, args) { if (f == null) { return null; } else if (CURRIED_KEY in f) { f = f[CURRIED_KEY]; for (let i = 0; i < args.length; i++) { f = f(args[i]); } return f; } else { switch (arity) { case 1: // Wrap arguments to make sure .concat doesn't destruct arrays. Example // [1,2].concat([3,4],5) --> [1,2,3,4,5] // fails // [1,2].concat([[3,4],5]) --> [1,2,[3,4],5] // ok return a1 => f.apply(null, args.concat([a1])); case 2: return a1 => a2 => f.apply(null, args.concat([a1, a2])); case 3: return a1 => a2 => a3 => f.apply(null, args.concat([a1, a2, a3])); case 4: return a1 => a2 => a3 => a4 => f.apply(null, args.concat([a1, a2, a3, a4])); case 5: return a1 => a2 => a3 => a4 => a5 => f.apply(null, args.concat([a1, a2, a3, a4, a5])); case 6: return a1 => a2 => a3 => a4 => a5 => a6 => f.apply(null, args.concat([a1, a2, a3, a4, a5, a6])); case 7: return a1 => a2 => a3 => a4 => a5 => a6 => a7 => f.apply(null, args.concat([a1, a2, a3, a4, a5, a6, a7])); case 8: return a1 => a2 => a3 => a4 => a5 => a6 => a7 => a8 => f.apply(null, args.concat([a1, a2, a3, a4, a5, a6, a7, a8])); default: throw new Error("Partially applying to more than 8-arity is not supported: " + arity); } } } function addToDict(dict, k, v) { if (dict.has(k)) { throw new Error("An item with the same key has already been added. Key: " + k); } dict.set(k, v); } function getItemFromDict(map, key) { if (map.has(key)) { return map.get(key); } else { throw new Error(`The given key '${key}' was not present in the dictionary.`); } } // https://github.com/MikeMcl/big.js/blob/01b3ce3a6b0ba7b42442ea48ec4ffc88d1669ec4/big.mjs var P = { GetHashCode() { return combineHashCodes([this.s, this.e].concat(this.c)); }, Equals(x) { return !this.cmp(x); }, CompareTo(x) { return this.cmp(x); } }; /* * big.js v5.2.2 * A small, fast, easy-to-use library for arbitrary-precision decimal arithmetic. * Copyright (c) 2018 Michael Mclaughlin <M8ch88l@gmail.com> * https://github.com/MikeMcl/big.js/LICENCE */ /************************************** EDITABLE DEFAULTS *****************************************/ // The default values below must be integers within the stated ranges. /* * The maximum number of decimal places (DP) of the results of operations involving division: * div and sqrt, and pow with negative exponents. */ var DP = 28, // 0 to MAX_DP /* * The rounding mode (RM) used when rounding to the above decimal places. * * 0 Towards zero (i.e. truncate, no rounding). (ROUND_DOWN) * 1 To nearest neighbour. If equidistant, round up. (ROUND_HALF_UP) * 2 To nearest neighbour. If equidistant, to even. (ROUND_HALF_EVEN) * 3 Away from zero. (ROUND_UP) */ RM = 1, // 0, 1, 2 or 3 // The maximum value of DP and Big.DP. MAX_DP = 1E6, // 0 to 1000000 // The maximum magnitude of the exponent argument to the pow method. MAX_POWER = 1E6, // 1 to 1000000 /* * The negative exponent (NE) at and beneath which toString returns exponential notation. * (JavaScript numbers: -7) * -1000000 is the minimum recommended exponent value of a Big. */ NE = -29, // 0 to -1000000 /* * The positive exponent (PE) at and above which toString returns exponential notation. * (JavaScript numbers: 21) * 1000000 is the maximum recommended exponent value of a Big. * (This limit is not enforced or checked.) */ PE = 29, // 0 to 1000000 /**************************************************************************************************/ // Error messages. NAME = "[big.js] ", INVALID = NAME + "Invalid ", INVALID_DP = INVALID + "decimal places", INVALID_RM = INVALID + "rounding mode", DIV_BY_ZERO = NAME + "Division by zero", UNDEFINED = void 0, NUMERIC = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i; /* * Create and return a Big constructor. * */ function _Big_() { /* * The Big constructor and exported function. * Create and return a new instance of a Big number object. * * n {number|string|Big} A numeric value. */ function Big(n) { var x = this; // Enable constructor usage without new. if (!(x instanceof Big)) return n === UNDEFINED ? _Big_() : new Big(n); // Duplicate. if (n instanceof Big) { x.s = n.s; x.e = n.e; x.c = n.c.slice(); normalize(x); } else { parse(x, n); } /* * Retain a reference to this Big constructor, and shadow Big.prototype.constructor which * points to Object. */ x.constructor = Big; } Big.prototype = P; Big.DP = DP; Big.RM = RM; Big.NE = NE; Big.PE = PE; Big.version = "5.2.2"; return Big; } function normalize(x) { x = round(x, DP, 0); if (x.c.length > 1 && !x.c[0]) { let i = x.c.findIndex(x => x); x.c = x.c.slice(i); x.e = x.e - i; } } /* * Parse the number or string value passed to a Big constructor. * * x {Big} A Big number instance. * n {number|string} A numeric value. */ function parse(x, n) { var e, i, nl; // Minus zero? if (n === 0 && 1 / n < 0) n = "-0";else if (!NUMERIC.test(n += "")) throw Error(INVALID + "number"); // Determine sign. x.s = n.charAt(0) == "-" ? (n = n.slice(1), -1) : 1; // Decimal point? if ((e = n.indexOf(".")) > -1) n = n.replace(".", ""); // Exponential form? if ((i = n.search(/e/i)) > 0) { // Determine exponent. if (e < 0) e = i; e += +n.slice(i + 1); n = n.substring(0, i); } else if (e < 0) { // Integer. e = n.length; } nl = n.length; // Determine leading zeros before decimal point. for (i = 0; i < e && i < nl && n.charAt(i) == "0";) ++i; // older version (ignores decimal point). // // Determine leading zeros. // for (i = 0; i < nl && n.charAt(i) == '0';) ++i; if (i == nl) { // Zero. x.c = [x.e = 0]; } else { x.e = e - i - 1; x.c = []; // Convert string to array of digits without leading zeros for (e = 0; i < nl;) x.c[e++] = +n.charAt(i++); // older version (doesn't keep trailing zeroes). // // Determine trailing zeros. // for (; nl > 0 && n.charAt(--nl) == '0';); // // Convert string to array of digits without leading/trailing zeros. // for (e = 0; i <= nl;) x.c[e++] = +n.charAt(i++); } x = round(x, Big.DP, Big.RM); return x; } /* * Round Big x to a maximum of dp decimal places using rounding mode rm. * Called by stringify, P.div, P.round and P.sqrt. * * x {Big} The Big to round. * dp {number} Integer, 0 to MAX_DP inclusive. * rm {number} 0, 1, 2 or 3 (DOWN, HALF_UP, HALF_EVEN, UP) * [more] {boolean} Whether the result of division was truncated. */ function round(x, dp, rm, more) { var xc = x.c, i = x.e + dp + 1; if (i < xc.length) { if (rm === 1) { // xc[i] is the digit after the digit that may be rounded up. more = xc[i] >= 5; } else if (rm === 2) { more = xc[i] > 5 || xc[i] == 5 && (more || i < 0 || xc[i + 1] !== UNDEFINED || xc[i - 1] & 1); } else if (rm === 3) { more = more || !!xc[0]; } else { more = false; if (rm !== 0) throw Error(INVALID_RM); } if (i < 1) { xc.length = 1; if (more) { // 1, 0.1, 0.01, 0.001, 0.0001 etc. x.e = -dp; xc[0] = 1; } else { // Zero. xc[0] = x.e = 0; } } else { // Remove any digits after the required decimal places. xc.length = i--; // Round up? if (more) { // Rounding up may mean the previous digit has to be rounded up. for (; ++xc[i] > 9;) { xc[i] = 0; if (!i--) { ++x.e; xc.unshift(1); } } } // Remove trailing zeros. for (i = xc.length; !xc[--i];) xc.pop(); } } else if (rm < 0 || rm > 3 || rm !== ~~rm) { throw Error(INVALID_RM); } return x; } /* * Return a string representing the value of Big x in normal or exponential notation. * Handles P.toExponential, P.toFixed, P.toJSON, P.toPrecision, P.toString and P.valueOf. * * x {Big} * id? {number} Caller id. * 1 toExponential * 2 toFixed * 3 toPrecision * 4 valueOf * n? {number|undefined} Caller's argument. * k? {number|undefined} */ function stringify(x, id, n, k) { var e, s, Big = x.constructor, z = !x.c[0]; if (n !== UNDEFINED) { if (n !== ~~n || n < (id == 3) || n > MAX_DP) { throw Error(id == 3 ? INVALID + "precision" : INVALID_DP); } x = new Big(x); // The index of the digit that may be rounded up. n = k - x.e; // Round? if (x.c.length > ++k) round(x, n, Big.RM); // toFixed: recalculate k as x.e may have changed if value rounded up. if (id == 2) k = x.e + n + 1; // Append zeros? for (; x.c.length < k;) x.c.push(0); } e = x.e; s = x.c.join(""); n = s.length; // Exponential notation? if (id != 2 && (id == 1 || id == 3 && k <= e || e <= Big.NE || e >= Big.PE)) { s = s.charAt(0) + (n > 1 ? "." + s.slice(1) : "") + (e < 0 ? "e" : "e+") + e; // Normal notation. } else if (e < 0) { for (; ++e;) s = "0" + s; s = "0." + s; } else if (e > 0) { if (++e > n) for (e -= n; e--;) s += "0";else if (e < n) s = s.slice(0, e) + "." + s.slice(e); } else if (n > 1) { s = s.charAt(0) + "." + s.slice(1); } return x.s < 0 && (!z || id == 4) ? "-" + s : s; } // Prototype/instance methods /* * Return a new Big whose value is the absolute value of this Big. */ P.abs = function () { var x = new this.constructor(this); x.s = 1; return x; }; /* * Return 1 if the value of this Big is greater than the value of Big y, * -1 if the value of this Big is less than the value of Big y, or * 0 if they have the same value. */ P.cmp = function (y) { var isneg, Big = this.constructor, x = new Big(this), y = new Big(y), xc = x.c, yc = y.c, i = x.s, j = y.s, k = x.e, l = y.e; // Either zero? if (!xc[0] || !yc[0]) return !xc[0] ? !yc[0] ? 0 : -j : i; // Signs differ? if (i != j) return i; isneg = i < 0; // Compare exponents. if (k != l) return k > l ^ isneg ? 1 : -1; // Compare digit by digit. j = Math.max(xc.length, yc.length); for (i = 0; i < j; i++) { k = i < xc.length ? xc[i] : 0; l = i < yc.length ? yc[i] : 0; if (k != l) return k > l ^ isneg ? 1 : -1; } return 0; // old version (doesn't compare well trailing zeroes, e.g. 1.0 with 1.00) // j = (k = xc.length) < (l = yc.length) ? k : l; // // Compare digit by digit. // for (i = -1; ++i < j;) { // if (xc[i] != yc[i]) return xc[i] > yc[i] ^ isneg ? 1 : -1; // } // // Compare lengths. // return k == l ? 0 : k > l ^ isneg ? 1 : -1; }; /* * Return a new Big whose value is the value of this Big divided by the value of Big y, rounded, * if necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM. */ P.div = function (y) { var Big = this.constructor, x = new Big(this), y = new Big(y), a = x.c, // dividend b = y.c, // divisor k = x.s == y.s ? 1 : -1, dp = Big.DP; if (dp !== ~~dp || dp < 0 || dp > MAX_DP) throw Error(INVALID_DP); // Divisor is zero? if (!b[0]) throw Error(DIV_BY_ZERO); // Dividend is 0? Return +-0. if (!a[0]) return new Big(k * 0); var bl, bt, n, cmp, ri, bz = b.slice(), ai = bl = b.length, al = a.length, r = a.slice(0, bl), // remainder rl = r.length, q = y, // quotient qc = q.c = [], qi = 0, d = dp + (q.e = x.e - y.e) + 1; // number of digits of the result q.s = k; k = d < 0 ? 0 : d; // Create version of divisor with leading zero. bz.unshift(0); // Add zeros to make remainder as long as divisor. for (; rl++ < bl;) r.push(0); do { // n is how many times the divisor goes into current remainder. for (n = 0; n < 10; n++) { // Compare divisor and remainder. if (bl != (rl = r.length)) { cmp = bl > rl ? 1 : -1; } else { for (ri = -1, cmp = 0; ++ri < bl;) { if (b[ri] != r[ri]) { cmp = b[ri] > r[ri] ? 1 : -1; break; } } } // If divisor < remainder, subtract divisor from remainder. if (cmp < 0) { // Remainder can't be more than 1 digit longer than divisor. // Equalise lengths using divisor with extra leading zero? for (bt = rl == bl ? b : bz; rl;) { if (r[--rl] < bt[rl]) { ri = rl; for (; ri && !r[--ri];) r[ri] = 9; --r[ri]; r[rl] += 10; } r[rl] -= bt[rl]; } for (; !r[0];) r.shift(); } else { break; } } // Add the digit n to the result array. qc[qi++] = cmp ? n : ++n; // Update the remainder. if (r[0] && cmp) r[rl] = a[ai] || 0;else r = [a[ai]]; } while ((ai++ < al || r[0] !== UNDEFINED) && k--); // Leading zero? Do not remove if result is simply zero (qi == 1). if (!qc[0] && qi != 1) { // There can't be more than one zero. qc.shift(); q.e--; } // Round? if (qi > d) round(q, dp, Big.RM, r[0] !== UNDEFINED); return q; }; /* * Return true if the value of this Big is equal to the value of Big y, otherwise return false. */ P.eq = function (y) { return !this.cmp(y); }; /* * Return true if the value of this Big is greater than the value of Big y, otherwise return * false. */ P.gt = function (y) { return this.cmp(y) > 0; }; /* * Return true if the value of this Big is greater than or equal to the value of Big y, otherwise * return false. */ P.gte = function (y) { return this.cmp(y) > -1; }; /* * Return true if the value of this Big is less than the value of Big y, otherwise return false. */ P.lt = function (y) { return this.cmp(y) < 0; }; /* * Return true if the value of this Big is less than or equal to the value of Big y, otherwise * return false. */ P.lte = function (y) { return this.cmp(y) < 1; }; /* * Return a new Big whose value is the value of this Big minus the value of Big y. */ P.minus = P.sub = function (y) { var i, j, t, xlty, Big = this.constructor, x = new Big(this), y = new Big(y), a = x.s, b = y.s; // Signs differ? if (a != b) { y.s = -b; return x.plus(y); } var xc = x.c.slice(), xe = x.e, yc = y.c, ye = y.e; // Either zero? if (!xc[0] || !yc[0]) { // y is non-zero? x is non-zero? Or both are zero. return yc[0] ? (y.s = -b, y) : new Big(xc[0] ? x : 0); } // Determine which is the bigger number. Prepend zeros to equalise exponents. if (a = xe - ye) { if (xlty = a < 0) { a = -a; t = xc; } else { ye = xe; t = yc; } t.reverse(); for (b = a; b--;) t.push(0); t.reverse(); } else { // Exponents equal. Check digit by digit. j = ((xlty = xc.length < yc.length) ? xc : yc).length; for (a = b = 0; b < j; b++) { if (xc[b] != yc[b]) { xlty = xc[b] < yc[b]; break; } } } // x < y? Point xc to the array of the bigger number. if (xlty) { t = xc; xc = yc; yc = t; y.s = -y.s; } /* * Append zeros to xc if shorter. No need to add zeros to yc if shorter as subtraction only * needs to start at yc.length. */ if ((b = (j = yc.length) - (i = xc.length)) > 0) for (; b--;) xc[i++] = 0; // Subtract yc from xc. for (b = i; j > a;) { if (xc[--j] < yc[j]) { for (i = j; i && !xc[--i];) xc[i] = 9; --xc[i]; xc[j] += 10; } xc[j] -= yc[j]; } // Remove trailing zeros. for (; xc[--b] === 0;) xc.pop(); // Remove leading zeros and adjust exponent accordingly. for (; xc[0] === 0;) { xc.shift(); --ye; } if (!xc[0]) { // n - n = +0 y.s = 1; // Result must be zero. xc = [ye = 0]; } y.c = xc; y.e = ye; return y; }; /* * Return a new Big whose value is the value of this Big modulo the value of Big y. */ P.mod = function (y) { var ygtx, Big = this.constructor, x = new Big(this), y = new Big(y), a = x.s, b = y.s; if (!y.c[0]) throw Error(DIV_BY_ZERO); x.s = y.s = 1; ygtx = y.cmp(x) == 1; x.s = a; y.s = b; if (ygtx) return new Big(x); a = Big.DP; b = Big.RM; Big.DP = Big.RM = 0; x = x.div(y); Big.DP = a; Big.RM = b; return this.minus(x.times(y)); }; /* * Return a new Big whose value is the value of this Big plus the value of Big y. */ P.plus = P.add = function (y) { var t, Big = this.constructor, x = new Big(this), y = new Big(y), a = x.s, b = y.s; // Signs differ? if (a != b) { y.s = -b; return x.minus(y); } var xe = x.e, xc = x.c, ye = y.e, yc = y.c; // Either zero? y is non-zero? x is non-zero? Or both are zero. if (!xc[0] || !yc[0]) return yc[0] ? y : new Big(xc[0] ? x : a * 0); xc = xc.slice(); // Prepend zeros to equalise exponents. // Note: reverse faster than unshifts. if (a = xe - ye) { if (a > 0) { ye = xe; t = yc; } else { a = -a; t = xc; } t.reverse(); for (; a--;) t.push(0); t.reverse(); } // Point xc to the longer array. if (xc.length - yc.length < 0) { t = yc; yc = xc; xc = t; } a = yc.length; // Only start adding at yc.length - 1 as the further digits of xc can be left as they are. for (b = 0; a; xc[a] %= 10) b = (xc[--a] = xc[a] + yc[a] + b) / 10 | 0; // No need to check for zero, as +x + +y != 0 && -x + -y != 0 if (b) { xc.unshift(b); ++ye; } // Remove trailing zeros. for (a = xc.length; xc[--a] === 0;) xc.pop(); y.c = xc; y.e = ye; return y; }; /* * Return a Big whose value is the value of this Big raised to the power n. * If n is negative, round to a maximum of Big.DP decimal places using rounding * mode Big.RM. * * n {number} Integer, -MAX_POWER to MAX_POWER inclusive. */ P.pow = function (n) { var Big = this.constructor, x = new Big(this), y = new Big(1), one = new Big(1), isneg = n < 0; if (n !== ~~n || n < -MAX_POWER || n > MAX_POWER) throw Error(INVALID + "exponent"); if (isneg) n = -n; for (;;) { if (n & 1) y = y.times(x); n >>= 1; if (!n) break; x = x.times(x); } return isneg ? one.div(y) : y; }; /* * Return a new Big whose value is the value of this Big rounded using rounding mode rm * to a maximum of dp decimal places, or, if dp is negative, to an integer which is a * multiple of 10**-dp. * If dp is not specified, round to 0 decimal places. * If rm is not specified, use Big.RM. * * dp? {number} Integer, -MAX_DP to MAX_DP inclusive. * rm? 0, 1, 2 or 3 (ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_UP) */ P.round = function (dp, rm) { var Big = this.constructor; if (dp === UNDEFINED) dp = 0;else if (dp !== ~~dp || dp < -MAX_DP || dp > MAX_DP) throw Error(INVALID_DP); return round(new Big(this), dp, rm === UNDEFINED ? Big.RM : rm); }; /* * Return a new Big whose value is the square root of the value of this Big, rounded, if * necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM. */ P.sqrt = function () { var r, c, t, Big = this.constructor, x = new Big(this), s = x.s, e = x.e, half = new Big(0.5); // Zero? if (!x.c[0]) return new Big(x); // Negative? if (s < 0) throw Error(NAME + "No square root"); // Estimate. s = Math.sqrt(x + ""); // Math.sqrt underflow/overflow? // Re-estimate: pass x coefficient to Math.sqrt as integer, then adjust the result exponent. if (s === 0 || s === 1 / 0) { c = x.c.join(""); if (!(c.length + e & 1)) c += "0"; s = Math.sqrt(c); e = ((e + 1) / 2 | 0) - (e < 0 || e & 1); r = new Big((s == 1 / 0 ? "1e" : (s = s.toExponential()).slice(0, s.indexOf("e") + 1)) + e); } else { r = new Big(s); } e = r.e + (Big.DP += 4); // Newton-Raphson iteration. do { t = r; r = half.times(t.plus(x.div(t))); } while (t.c.slice(0, e).join("") !== r.c.slice(0, e).join("")); return round(r, Big.DP -= 4, Big.RM); }; /* * Return a new Big whose value is the value of this Big times the value of Big y. */ P.times = P.mul = function (y) { var c, Big = this.constructor, x = new Big(this), y = new Big(y), xc = x.c, yc = y.c, a = xc.length, b = yc.length, i = x.e, j = y.e; // Determine sign of result. y.s = x.s == y.s ? 1 : -1; // Return signed 0 if either 0. if (!xc[0] || !yc[0]) return new Big(y.s * 0); // Initialise exponent of result as x.e + y.e. y.e = i + j; // If array xc has fewer digits than yc, swap xc and yc, and lengths. if (a < b) { c = xc; xc = yc; yc = c; j = a; a = b; b = j; } // Initialise coefficient array of result with zeros. for (c = new Array(j = a + b); j--;) c[j] = 0; // Multiply. // i is initially xc.length. for (i = b; i--;) { b = 0; // a is yc.length. for (j = a + i; j > i;) { // Current sum of products at this digit position, plus carry. b = c[j] + yc[i] * xc[j - i - 1] + b; c[j--] = b % 10; // carry b = b / 10 | 0; } c[j] = (c[j] + b) % 10; } // Increment result exponent if there is a final carry, otherwise remove leading zero. if (b) ++y.e;else c.shift(); // Remove trailing zeros. for (i = c.length; !c[--i];) c.pop(); y.c = c; return y; }; /* * Return a string representing the value of this Big in exponential notation to dp fixed decimal * places and rounded using Big.RM. * * dp? {number} Integer, 0 to MAX_DP inclusive. */ P.toExponential = function (dp) { return stringify(this, 1, dp, dp); }; /* * Return a string representing the value of this Big in normal notation to dp fixed decimal * places and rounded using Big.RM. * * dp? {number} Integer, 0 to MAX_DP inclusive. * * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'. * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. */ P.toFixed = function (dp) { return stringify(this, 2, dp, this.e + dp); }; /* * Return a string representing the value of this Big rounded to sd significant digits using * Big.RM. Use exponential notation if sd is less than the number of digits necessary to represent * the integer part of the value in normal notation. * * sd {number} Integer, 1 to MAX_DP inclusive. */ P.toPrecision = function (sd) { return stringify(this, 3, sd, sd - 1); }; /* * Return a string representing the value of this Big. * Return exponential notation if this Big has a positive exponent equal to or greater than * Big.PE, or a negative exponent equal to or less than Big.NE. * Omit the sign for negative zero. */ P.toString = function () { return stringify(this); }; /* * Return a string representing the value of this Big. * Return exponential notation if this Big has a positive exponent equal to or greater than * Big.PE, or a negative exponent equal to or less than Big.NE. * Include the sign for negative zero. */ P.valueOf = P.toJSON = function () { return stringify(this, 4); }; // Export var Big = _Big_(); const get_Zero = new Big(0); const get_One = new Big(1); const get_MinusOne = new Big(-1); const get_MaxValue = new Big("79228162514264337593543950335"); const get_MinValue = new Big("-79228162514264337593543950335"); var NumberStyles; (function (NumberStyles) { // None = 0x00000000, // AllowLeadingWhite = 0x00000001, // AllowTrailingWhite = 0x00000002, // AllowLeadingSign = 0x00000004, // AllowTrailingSign = 0x00000008, // AllowParentheses = 0x00000010, // AllowDecimalPoint = 0x00000020, // AllowThousands = 0x00000040, // AllowExponent = 0x00000080, // AllowCurrencySymbol = 0x00000100, NumberStyles[NumberStyles["AllowHexSpecifier"] = 512] = "AllowHexSpecifier"; // Integer = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign, // HexNumber = AllowLeadingWhite | AllowTrailingWhite | AllowHexSpecifier, // Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | // AllowTrailingSign | AllowDecimalPoint | AllowThousands, // Float = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | // AllowDecimalPoint | AllowExponent, // Currency = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign | // AllowParentheses | AllowDecimalPoint | AllowThousands | AllowCurrencySymbol, // Any = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign | // AllowParentheses | AllowDecimalPoint | AllowThousands | AllowCurrencySymbol | AllowExponent, })(NumberStyles || (NumberStyles = {})); function validResponse(regexMatch, radix) { const [_all, sign, prefix, digits] = regexMatch; return { sign: sign || "", prefix: prefix || "", digits, radix }; } function getRange(unsigned, bitsize) { switch (bitsize) { case 8: return unsigned ? [0, 255] : [-128, 127]; case 16: return unsigned ? [0, 65535] : [-32768, 32767]; case 32: return unsigned ? [0, 4294967295] : [-2147483648, 2147483647]; default: throw new Error("Invalid bit size."); } } function getInvalidDigits(radix) { switch (radix) { case 2: return /[^0-1]/; case 8: return /[^0-7]/; case 10: return /[^0-9]/; case 16: return /[^0-9a-fA-F]/; default: throw new Error("Invalid Base."); } } function getRadix(prefix, style) { if (style & NumberStyles.AllowHexSpecifier) { return 16; } else { switch (prefix) { case "0b": case "0B": return 2; case "0o": case "0O": return 8; case "0x": case "0X": return 16; default: return 10; } } } function isValid(str, style, radix) { const integerRegex = /^\s*([\+\-])?(0[xXoObB])?([0-9a-fA-F]+)\s*$/; const res = integerRegex.exec(str.replace(/_/g, "")); if (res != null) { const [_all, sign, prefix, digits] = res; radix = radix || getRadix(prefix, style); const invalidDigits = getInvalidDigits(radix); if (!invalidDigits.test(digits)) { return validResponse(res, radix); } } return null; } function parse$1(str, style, unsigned, bitsize, radix) { const res = isValid(str, style, radix); if (res != null) { let v = Number.parseInt(res.sign + res.digits, res.radix); if (!Number.isNaN(v)) { const [umin, umax] = getRange(true, bitsize); if (!unsigned && res.radix !== 10 && v >= umin && v <= umax) { v = v << 32 - bitsize >> 32 - bitsize; } const [min, max] = getRange(unsigned, bitsize); if (v >= min && v <= max) { return v; } } } throw new Error("Input string was not in a correct format."); } function tryParse(str, style, unsigned, bitsize) { try { const v = parse$1(str, style, unsigned, bitsize); return [true, v]; } catch (_a) {// supress error } return [false, 0]; } // Adapted from: https://github.com/dcodeIO/long.js/blob/master/src/long.js /** * wasm optimizations, to do native i64 multiplication and divide */ var wasm = null; try { wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports; } catch (e) {} // no wasm support :( /** * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers. * See the from* functions below for more convenient ways of constructing Longs. * @exports Long * @class A Long class for representing a 64 bit two's-complement integer value. * @param {number} low The low (signed) 32 bits of the long * @param {number} high The high (signed) 32 bits of the long * @param {boolean=} unsigned Whether unsigned or not, defaults to signed * @constructor */ function Long(low, high, unsigned) { /** * The low 32 bits as a signed value. * @type {number} */ this.low = low | 0; /** * The high 32 bits as a signed value. * @type {number} */ this.high = high | 0; /** * Whether unsigned or not. * @type {boolean} */ this.unsigned = !!unsigned; } Long.prototype.GetHashCode = function () { let h1 = this.unsigned ? 1 : 0; h1 = (h1 << 5) + h1 ^ this.high; h1 = (h1 << 5) + h1 ^ this.low; return h1; }; Long.prototype.Equals = function (x) { return equals$1(this, x); }; Long.prototype.CompareTo = function (x) { return compare$1(this, x); }; Long.prototype.toString = function (radix) { return toString(this, radix); }; Long.prototype.toJSON = function () { return toString(this); }; // The internal representation of a long is the two given signed, 32-bit values. Object.defineProperty(Long.prototype, "__isLong__", { value: true }); /** * @function * @param {*} obj Object * @returns {boolean} * @inner */ function isLong(obj) { return (obj && obj["__isLong__"]) === true; } /** * Tests if the specified object is a Long. * @function * @param {*} obj Object * @returns {boolean} */ // Long.isLong = isLong; /** * A cache of the Long representations of small integer values. * @type {!Object} * @inner */ var INT_CACHE = {}; /** * A cache of the Long representations of small unsigned integer values. * @type {!Object} * @inner */ var UINT_CACHE = {}; /** * @param {number} value * @param {boolean=} unsigned * @returns {!Long} * @inner */ function fromInt(value, unsigned) { var obj, cachedObj, cache; if (unsigned) { value >>>= 0; if (cache = 0 <= value && value < 256) { cachedObj = UINT_CACHE[value]; if (cachedObj) return cachedObj; } obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); if (cache) UINT_CACHE[value] = obj; return obj; } else { value |= 0; if (cache = -128 <= value && value < 128) { cachedObj = INT_CACHE[value]; if (cachedObj) return cachedObj; } obj = fromBits(value, value < 0 ? -1 : 0, false); if (cache) INT_CACHE[value] = obj; return obj; } } /** * Returns a Long representing the given 32 bit integer value. * @function * @param {number} value The 32 bit integer in question * @param {boolean=} unsigned Whether unsigned or not, defaults to signed * @returns {!Long} The corresponding Long value */ // Long.fromInt = fromInt; /** * @param {number} value * @param {boolean=} unsigned * @returns {!Long} * @inner */ function fromNumber(value, unsigned) { if (isNaN(value)) return unsigned ? UZERO : ZERO; if (unsigned) { if (value < 0) return UZERO; if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE; } else { if (value <= -TWO_PWR_63_DBL) return MIN_VALUE; if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE; } if (value < 0) return negate(fromNumber(-value, unsigned)); return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned); } /** * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. * @function * @param {number} value The number in question * @param {boolean=} unsigned Whether unsigned or not, defaults to signed * @returns {!Long} The corresponding Long value */ // Long.fromNumber = fromNumber; /** * @param {number} lowBits * @param {number} highBits * @param {boolean=} unsigned * @returns {!Long} * @inner */ function fromBits(lowBits, highBits, unsigned) { return new Long(lowBits, highBits, unsigned); } /** * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is * assumed to use 32 bits. * @function * @param {number} lowBits The low 32 bits * @param {number} highBits The high 32 bits * @param {boolean=} unsigned Whether unsigned or not, defaults to signed * @returns {!Long} The corresponding Long value */ // Long.fromBits = fromBits; /** * @function * @param {number} base * @param {number} exponent * @returns {number} * @inner */ var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4) /** * @param {string} str * @param {(boolean|number)=} unsigned * @param {number=} radix * @returns {!Long} * @inner */ function fromString(str, unsigned, radix) { if (str.length === 0) throw Error("empty string"); if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") return ZERO; if (typeof unsigned === "number") { // For goog.math.long compatibility radix = unsigned, unsigned = false; } else { unsigned = !!unsigned; } radix = radix || 10; if (radix < 2 || 36 < radix) throw RangeError("radix"); var p = str.indexOf("-"); if (p > 0) throw Error("interior hyphen");else if (p === 0) { return negate(fromString(str.substring(1), unsigned, radix)); } // Do several (8) digits each time through the loop, so as to // minimize the calls to the very expensive emulated div. var radixToPower = fromNumber(pow_dbl(radix, 8)); var result = ZERO; for (var i = 0; i < str.length; i += 8) { var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); if (size < 8) { var power = fromNumber(pow_dbl(radix, size)); result = add(multiply(result, power), fromNumber(value)); } else { result = multiply(result, radixToPower); result = add(result, fromNumber(value)); } } result.unsigned = unsigned; return result; } /** * Returns a Long representation of the given string, written using the specified radix. * @function * @param {string} str The textual representation of the Long * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed * @param {number=} radix The radix in which the text is written (2-36), defaults to 10 * @returns {!Long} The corresponding Long value */ // Long.fromString = fromString; /** * @function * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val * @param {boolean=} unsigned * @returns {!Long} * @inner */ function fromValue(val, unsigned) { if (typeof val === "number") return fromNumber(val, unsigned); if (typeof val === "string") return fromString(val, unsigned); // Throws for non-objects, converts non-instanceof Long: return fromBits(val.low, val.high, typeof unsigned === "boolean" ? unsigned : val.unsigned); } /** * Converts the specified value to a Long using the appropriate from* function for its type. * @function * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value * @param {boolean=} unsigned Whether unsigned or not, defaults to signed * @returns {!Long} */ // Long.fromValue = fromValue; // NOTE: the compiler should inline these constant values below and then remove these variables, so there should be // no runtime penalty for these. /** * @type {number} * @const * @inner */ var TWO_PWR_16_DBL = 1 << 16; /** * @type {number} * @const * @inner */ var TWO_PWR_24_DBL = 1 << 24; /** * @type {number} * @const * @inner */ var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; /** * @type {number} * @const * @inner */ var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; /** * @type {number} * @const * @inner */ var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; /** * @type {!Long} * @const * @inner */ var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); /** * @type {!Long} * @inner */ var ZERO = fromInt(0); /** * Signed zero. * @type {!Long} */ // Long.ZERO = ZERO; /** * @type {!Long} * @inner */ var UZERO = fromInt(0, true); /** * Unsigned zero. * @type {!Long} */ // Long.UZERO = UZERO; /** * @type {!Long} * @inner */ var ONE = fromInt(1); /** * Signed one. * @type {!Long} */ // Long.ONE = ONE; /** * @type {!Long} * @inner */ var UONE = fromInt(1, true); /** * Unsigned one. * @type {!Long} */ // Long.UONE = UONE; /** * @type {!Long} * @inner */ var NEG_ONE = fromInt(-1); /** * Signed negative one. * @type {!Long} */ // Long.NEG_ONE = NEG_ONE; /** * @type {!Long} * @inner */ var MAX_VALUE = fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0, false); /** * Maximum signed value. * @type {!Long} */ // Long.MAX_VALUE = MAX_VALUE; /** * @type {!Long} * @inner */ var MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF | 0, 0xFFFFFFFF | 0, true); /** * Maximum unsigned value. * @type {!Long} */ // Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; /** * @type {!Long} * @inner */ var MIN_VALUE = fromBits(0, 0x80000000 | 0, false); /** * Minimum signed value. * @type {!Long} */ // Long.MIN_VALUE = MIN_VALUE; /** * @alias Long.prototype * @inner */ // var LongPrototype = Long.prototype; /** * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer. * @this {!Long} * @returns {number} */ function toInt($this) { return $this.unsigned ? $this.low >>> 0 : $this.low; } /** * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa). * @this {!Long} * @returns {number} */ function toNumber($this) { if ($this.unsigned) return ($this.high >>> 0) * TWO_PWR_32_DBL + ($this.low >>> 0); return $this.high * TWO_PWR_32_DBL + ($this.low >>> 0); } /** * Converts the Long to a string written in the specified radix. * @this {!Long} * @param {number=} radix Radix (2-36), defaults to 10 * @returns {string} * @override * @throws {RangeError} If `radix` is out of range */ function toString($this, radix) { radix = radix || 10; if (radix < 2 || 36 < radix) throw RangeError("radix"); if (isZero($this)) return "0"; if (isNegative($this)) { // Unsigned Longs are never negative if (equals$1($this, MIN_VALUE)) { // We need to change the Long value before it can be negated, so we remove // the bottom-most digit in this base and then recurse to do the rest. var radixLong = fromNumber(radix), div = divide($this, radixLong), rem1 = subtract(multiply(div, radixLong), $this); return toString(div, radix) + toInt(rem1).toString(radix); } else return "-" + toString(negate($this), radix); } // Do several (6) digits each time through the loop, so as to // minimize the calls to the very expensive emulated div. var radixToPower = fromNumber(pow_dbl(radix, 6), $this.unsigned), rem = $this; var result = ""; while (true) { var remDiv = divide(rem, radixToPower), intval = toInt(subtract(rem, multiply(remDiv, radixToPower))) >>> 0, digits = intval.toString(radix); rem = remDiv; if (isZero(rem)) return digits + result;else { while (digits.length < 6) digits = "0" + digits; result = "" + digits + result; } } } /** * Tests if this Long's value equals zero. * @this {!Long} * @returns {boolean} */ function isZero($this) { return $this.high === 0 && $this.low === 0; } /** * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}. * @returns {boolean} */ // LongPrototype.eqz = LongPrototype.isZero; /** * Tests if this Long's value is negative. * @this {!Long} * @returns {boolean} */ function isNegative($this) { return !$this.unsigned && $this.high < 0; } /** * Tests if this Long's value is odd. * @this {!Long} * @returns