mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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
 | 
						|
};
 |