|
|
'use strict';
var alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('') , length = 64 , map = {} , seed = 0 , i = 0 , prev;
/** * Return a string representing the specified number. * * @param {Number} num The number to convert. * @returns {String} The string representation of the number. * @api public */ function encode(num) { var encoded = '';
do { encoded = alphabet[num % length] + encoded; num = Math.floor(num / length); } while (num > 0);
return encoded; }
/** * Return the integer value specified by the given string. * * @param {String} str The string to convert. * @returns {Number} The integer value represented by the string. * @api public */ function decode(str) { var decoded = 0;
for (i = 0; i < str.length; i++) { decoded = decoded * length + map[str.charAt(i)]; }
return decoded; }
/** * Yeast: A tiny growing id generator. * * @returns {String} A unique id. * @api public */ function yeast() { var now = encode(+new Date());
if (now !== prev) return seed = 0, prev = now; return now +'.'+ encode(seed++); }
//
// Map each character to its index.
//
for (; i < length; i++) map[alphabet[i]] = i;
//
// Expose the `yeast`, `encode` and `decode` functions.
//
yeast.encode = encode; yeast.decode = decode; module.exports = yeast;
|