@epicallan/money-ts
Version:
TypeScript library for type-safe and lossless encoding and manipulation of world currencies and precious metals
125 lines • 4 kB
JavaScript
;
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