'use strict';
|
|
|
|
var randomFromSeed = require('./random/random-from-seed');
|
|
|
|
var ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';
|
|
var alphabet;
|
|
var previousSeed;
|
|
|
|
var shuffled;
|
|
|
|
function reset() {
|
|
shuffled = false;
|
|
}
|
|
|
|
function setCharacters(_alphabet_) {
|
|
if (!_alphabet_) {
|
|
if (alphabet !== ORIGINAL) {
|
|
alphabet = ORIGINAL;
|
|
reset();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (_alphabet_ === alphabet) {
|
|
return;
|
|
}
|
|
|
|
if (_alphabet_.length !== ORIGINAL.length) {
|
|
throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);
|
|
}
|
|
|
|
var unique = _alphabet_.split('').filter(function(item, ind, arr){
|
|
return ind !== arr.lastIndexOf(item);
|
|
});
|
|
|
|
if (unique.length) {
|
|
throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));
|
|
}
|
|
|
|
alphabet = _alphabet_;
|
|
reset();
|
|
}
|
|
|
|
function characters(_alphabet_) {
|
|
setCharacters(_alphabet_);
|
|
return alphabet;
|
|
}
|
|
|
|
function setSeed(seed) {
|
|
randomFromSeed.seed(seed);
|
|
if (previousSeed !== seed) {
|
|
reset();
|
|
previousSeed = seed;
|
|
}
|
|
}
|
|
|
|
function shuffle() {
|
|
if (!alphabet) {
|
|
setCharacters(ORIGINAL);
|
|
}
|
|
|
|
var sourceArray = alphabet.split('');
|
|
var targetArray = [];
|
|
var r = randomFromSeed.nextValue();
|
|
var characterIndex;
|
|
|
|
while (sourceArray.length > 0) {
|
|
r = randomFromSeed.nextValue();
|
|
characterIndex = Math.floor(r * sourceArray.length);
|
|
targetArray.push(sourceArray.splice(characterIndex, 1)[0]);
|
|
}
|
|
return targetArray.join('');
|
|
}
|
|
|
|
function getShuffled() {
|
|
if (shuffled) {
|
|
return shuffled;
|
|
}
|
|
shuffled = shuffle();
|
|
return shuffled;
|
|
}
|
|
|
|
/**
|
|
* lookup shuffled letter
|
|
* @param index
|
|
* @returns {string}
|
|
*/
|
|
function lookup(index) {
|
|
var alphabetShuffled = getShuffled();
|
|
return alphabetShuffled[index];
|
|
}
|
|
|
|
module.exports = {
|
|
characters: characters,
|
|
seed: setSeed,
|
|
lookup: lookup,
|
|
shuffled: getShuffled
|
|
};
|