UNPKG

@epicallan/money-ts

Version:

TypeScript library for type-safe and lossless encoding and manipulation of world currencies and precious metals

125 lines 4 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.show = exports.Ord = exports.Eq = exports.trunc = exports.ceil = exports.round = exports.floor = exports.sign = exports.div = exports.sub = exports.negate = exports.one = exports.mul = exports.zero = exports.add = exports.reduce = exports.isZero = exports.fromInteger = void 0; var EQ = require("fp-ts/Eq"); var bigInteger = require("./BigInteger"); var integer = require("./Integer"); var natural = require("./Natural"); var nonZeroInteger = require("./NonZeroInteger"); var function_1 = require("fp-ts/function"); var O = require("fp-ts/Option"); function fromInteger(x) { return [x, natural.one]; } exports.fromInteger = fromInteger; function isZero(x) { return integer.isZero(x[0]); } exports.isZero = isZero; function reduce(n, d) { return function_1.pipe(nonZeroInteger.fromInteger(n), O.fold(function () { return exports.zero; }, function (n) { var divisor = natural.gcd(nonZeroInteger.abs(n), d); var n2 = integer.div(n, divisor); var d2 = natural.div(d, divisor); return [n2, d2]; })); } exports.reduce = reduce; function add(_a, _b) { var nx = _a[0], dx = _a[1]; var ny = _b[0], dy = _b[1]; var multiple = natural.lcm(dx, dy); var a = natural.div(multiple, dx); var b = natural.div(multiple, dy); var xa = integer.mul(nx, a); var xb = integer.mul(ny, b); return reduce(integer.add(xa, xb), multiple); } exports.add = add; exports.zero = [integer.zero, natural.one]; function mul(x, y) { return reduce(integer.mul(x[0], y[0]), natural.mul(x[1], y[1])); } exports.mul = mul; exports.one = [integer.one, natural.one]; function negate(x) { return [integer.negate(x[0]), x[1]]; } exports.negate = negate; function sub(x, y) { return add(x, negate(y)); } exports.sub = sub; function div(x, y) { var ny = nonZeroInteger.abs(y[0]); var n = integer.mul(x[0], y[1]); return reduce(integer.isPositive(y[0]) ? n : integer.negate(n), natural.mul(x[1], ny)); } exports.div = div; function sign(x) { return integer.sign(x[0]); } exports.sign = sign; function floor(x) { var n = integer.unwrap(x[0]); var d = integer.unwrap(x[1]); var divmod = n.divmod(d); if (divmod.remainder.isZero() || sign(x) >= 0) { return integer.wrap(divmod.quotient); } else { return integer.wrap(divmod.quotient.prev()); } } exports.floor = floor; var semi = function_1.unsafeCoerce([bigInteger.one, bigInteger.two]); function round(x) { return floor(add(x, semi)); } exports.round = round; function ceil(x) { var n = integer.unwrap(x[0]); var d = integer.unwrap(x[1]); var divmod = n.divmod(d); if (divmod.remainder.isZero() || sign(x) < 0) { return integer.wrap(divmod.quotient); } else { return integer.wrap(divmod.quotient.next()); } } exports.ceil = ceil; function trunc(x) { if (sign(x) >= 0) { return floor(x); } else { return ceil(x); } } exports.trunc = trunc; exports.Eq = EQ.getTupleEq(integer.Eq, natural.Eq); exports.Ord = __assign(__assign({}, exports.Eq), { compare: function (_a, _b) { var nx = _a[0], dx = _a[1]; var ny = _b[0], dy = _b[1]; if (integer.Eq.equals(dx, dy)) { return integer.Ord.compare(nx, ny); } else { return integer.Ord.compare(integer.mul(nx, dy), integer.mul(ny, dx)); } } }); var show = function (x) { return integer.show(x[0]) + " / " + natural.show(x[1]); }; exports.show = show; //# sourceMappingURL=Rational.js.map