"use strict"; const CHARSET = ("abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ$_").split(""); module.exports = class Charset { constructor(shouldConsider) { this.shouldConsider = shouldConsider; this.chars = CHARSET.slice(); this.frequency = {}; this.chars.forEach(c => { this.frequency[c] = 0; }); this.finalized = false; } consider(str) { if (!this.shouldConsider) { return; } str.split("").forEach(c => { if (this.frequency[c] != null) { this.frequency[c]++; } }); } sort() { if (this.shouldConsider) { this.chars = this.chars.sort((a, b) => this.frequency[b] - this.frequency[a]); } this.finalized = true; } getIdentifier(num) { if (!this.finalized) { throw new Error("Should sort first"); } let ret = ""; num++; do { num--; ret += this.chars[num % this.chars.length]; num = Math.floor(num / this.chars.length); } while (num > 0); return ret; } };