| '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; |