UNPKG

timered-counter

Version:

Make the value change more vivid and natural

56 lines 1.73 kB
/** * @license https://github.com/HarasimowiczKamil/any-base */ import { isDeepEqual } from 'remeda'; function isValid(number, alphabet) { for (const char of number) { if (alphabet.indexOf(char) === -1) { return false; } } return true; } function convert(srcAlphabet, dstAlphabet, number) { let i; let divide; let newLen; let { length } = number; const numberMap = {}; const fromBase = srcAlphabet.length; const toBase = dstAlphabet.length; const result = []; if (!isValid(number, srcAlphabet)) { throw new Error(`Number "${number}" contains of non-alphabetic digits (${srcAlphabet})`); } if (isDeepEqual(srcAlphabet, dstAlphabet)) { return number.join(''); } for (i = 0; i < length; i++) { numberMap[i] = srcAlphabet.indexOf(number[i]); } do { divide = 0; newLen = 0; for (i = 0; i < length; i++) { divide = divide * fromBase + numberMap[i]; if (divide >= toBase) { numberMap[newLen++] = Math.floor(divide / toBase); divide %= toBase; } else if (newLen > 0) { numberMap[newLen++] = 0; } } length = newLen; result.push(dstAlphabet[divide]); } while (newLen !== 0); return result.reverse().join(''); } export function anyBase(sa, srcAlphabet, dstAlphabet) { return (number) => convert(sa.stringToChars(srcAlphabet), sa.stringToChars(dstAlphabet), sa.stringToChars(number)); } export const BIN = '01'; export const OCT = '01234567'; export const DEC = '0123456789'; export const HEX = '0123456789abcdef'; //# sourceMappingURL=any-base.js.map