UNPKG

asana-phrase

Version:

Random error phrase generator used by Asana

104 lines (98 loc) 2.73 kB
var assert = require('assert'); /** * @returns {Function} A function that, when called, returns a random 1 or 0 * with equal probability up until `len` digits. */ function randomBitGen(len) { assert.equal(typeof(len), 'number'); var remaining = len; return function() { if (remaining > 0) { remaining--; return Math.random() >= 0.5 ? 1 : 0; } else { return null; } }; } /** * @param value {number} * @returns {Function} A function that, when called, returns the bits of the * integer `value`, starting from least to most significant. */ function intBitGen(value) { assert.equal(typeof(value), 'number'); assert.equal(value, Math.floor(value), 'value is not an integer'); assert(value < Math.pow(2, 53), 'value too large to be integer'); var returnedAny = false; var remaining = value; return function() { if (remaining > 0 || !returnedAny) { var bit = remaining % 2; remaining >>= 1; returnedAny = true; return bit; } else { return null; } }; } /** * @param value {string} * @returns {Function} A function that, when called, returns the bits of the * hex string `value`, starting from least to most significant. */ function hexBitGen(value) { assert.equal(typeof(value), 'string'); assert(/^[0-9a-fA-F]+$/.test(value), 'value is not a hex number'); var returnedAny = false; var remaining = value; var offset = 0; var nibble = 0; return function() { if (offset++ % 4 === 0 && remaining.length > 0) { nibble = parseInt(remaining.substr(-1), 16); remaining = remaining.substr(0, remaining.length - 1); } if (nibble > 0 || remaining.length > 0 || !returnedAny) { var bit = nibble % 2; nibble >>= 1; returnedAny = true; return bit; } else { return null; } }; } /** * @param value {string} * @returns {Function} A function that, when called, returns the bits of the * binary digit string `value` (e.g. "10010110"), starting from least * to most significant. */ function binaryDigitBitGen(value) { assert.equal(typeof(value), 'string'); assert(/^[01]+$/.test(value), 'value is not a string of binary digits'); var returnedAny = false; var remaining = value; return function() { var bit = 0; if (remaining) { bit = remaining.charCodeAt(remaining.length - 1) - 48; remaining = remaining.substr(0, remaining.length - 1); returnedAny = true; return bit; } else if (!returnedAny) { returnedAny = true; return 0; } else { return null; } }; } module.exports = { random: randomBitGen, int: intBitGen, hex: hexBitGen, binaryDigit: binaryDigitBitGen };