@iota/area-codes
Version:
IOTA Area Codes (IAC) JavaScript
131 lines • 8.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const conversion_1 = require("./conversion");
/**
* All the available precisions.
*/
exports.PRECISIONS = [2, 4, 6, 8, 10, 11];
/**
* Decrease the precision of an area code.
* @param iotaAreaCode The IOTA Area Code to decrease the precision.
* @returns The decreased precision area code.
*/
function decreasePrecision(iotaAreaCode) {
const decoded = conversion_1.decode(iotaAreaCode);
if (decoded.codePrecision <= exports.PRECISIONS[0]) {
throw new Error("The precision can not be decreased any more");
}
return internalSetPrecision(iotaAreaCode, exports.PRECISIONS[exports.PRECISIONS.indexOf(decoded.codePrecision) - 1], decoded);
}
exports.decreasePrecision = decreasePrecision;
/**
* Increase the precision of an area code.
* @param iotaAreaCode The IOTA Area Code to increase the precision.
* @returns The increased precision area code.
*/
function increasePrecision(iotaAreaCode) {
const decoded = conversion_1.decode(iotaAreaCode);
if (decoded.codePrecision >= exports.PRECISIONS[exports.PRECISIONS.length - 1]) {
throw new Error("The precision can not be increased any more");
}
return internalSetPrecision(iotaAreaCode, exports.PRECISIONS[exports.PRECISIONS.indexOf(decoded.codePrecision) + 1], decoded);
}
exports.increasePrecision = increasePrecision;
/**
* Set the precision of an area code.
* @param iotaAreaCode The IOTA Area Code to set the precision.
* @param codePrecision The new precision to set.
* @returns The updated precision area code.
*/
function setPrecision(iotaAreaCode, codePrecision) {
const decoded = conversion_1.decode(iotaAreaCode);
return internalSetPrecision(iotaAreaCode, codePrecision, decoded);
}
exports.setPrecision = setPrecision;
/**
* Set the precision of an area code.
* @private
* @param iotaAreaCode The IOTA Area Code to set the precision.
* @param codePrecision The new precision to set.
* @param decoded The decoded area code.
* @returns The updated precision area code.
*/
function internalSetPrecision(iotaAreaCode, codePrecision, decoded) {
if (exports.PRECISIONS.indexOf(codePrecision) < 0) {
throw new Error(`codePrecision must be one of ${exports.PRECISIONS.join(", ")}`);
}
if (codePrecision === decoded.codePrecision) {
return iotaAreaCode;
}
else {
// The new code precision is less than the current one
// so just strip back the characters and pad
if (codePrecision < decoded.codePrecision) {
const reduced = iotaAreaCode.replace("9", "").substr(0, codePrecision);
if (codePrecision <= 8) {
return `${reduced}${"A".repeat(8 - codePrecision)}9`;
}
else {
return `${reduced.substr(0, 8)}9${reduced.substr(8)}`;
}
}
else {
// New precision is higher so we need to do some maths
// so just recalculate the location code based
// on the current center.
return conversion_1.encode(decoded.latitude, decoded.longitude, codePrecision);
}
}
}
exports.internalSetPrecision = internalSetPrecision;
/**
* Get the display dimensions for a area code precision.
* @param codePrecision The precision of an area code.
* @returns The display dimensions for the code precision.
*/
function getPrecisionDimensions(codePrecision) {
const dimensions = {
2: {
blocksSizeDegrees: 20,
blocksSizeDegreesFormatted: "20°",
sizeMetres: 2200000,
sizeMetresFormatted: "2200km"
},
4: {
blocksSizeDegrees: 1,
blocksSizeDegreesFormatted: "1°",
sizeMetres: 110000,
sizeMetresFormatted: "110km"
},
6: {
blocksSizeDegrees: 0.05,
blocksSizeDegreesFormatted: "0.05°",
sizeMetres: 5500,
sizeMetresFormatted: "110km"
},
8: {
blocksSizeDegrees: 0.0025,
blocksSizeDegreesFormatted: "0.0025°",
sizeMetres: 275,
sizeMetresFormatted: "275m"
},
10: {
blocksSizeDegrees: 0.000125,
blocksSizeDegreesFormatted: "0.000125°",
sizeMetres: 14,
sizeMetresFormatted: "14m"
},
11: {
blocksSizeDegrees: undefined,
blocksSizeDegreesFormatted: undefined,
sizeMetres: 3.5,
sizeMetresFormatted: "3.5m"
}
};
if (!dimensions[codePrecision]) {
throw new Error("codePrecision must be 2, 4, 6, 8, 10 or 11");
}
return dimensions[codePrecision];
}
exports.getPrecisionDimensions = getPrecisionDimensions;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlY2lzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3ByZWNpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUE4QztBQUk5Qzs7R0FFRztBQUNVLFFBQUEsVUFBVSxHQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUV6RDs7OztHQUlHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsWUFBb0I7SUFDbEQsTUFBTSxPQUFPLEdBQUcsbUJBQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVyQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksa0JBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7S0FDbEU7SUFFRCxPQUFPLG9CQUFvQixDQUFDLFlBQVksRUFBRSxrQkFBVSxDQUFDLGtCQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsSCxDQUFDO0FBUkQsOENBUUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsWUFBb0I7SUFDbEQsTUFBTSxPQUFPLEdBQUcsbUJBQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVyQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksa0JBQVUsQ0FBQyxrQkFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7S0FDbEU7SUFFRCxPQUFPLG9CQUFvQixDQUFDLFlBQVksRUFBRSxrQkFBVSxDQUFDLGtCQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNs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