@beenotung/tslib
Version:
utils library in Typescript
129 lines (128 loc) • 4.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Random = exports.alphabetNumLetters = exports.symbolLetters = exports.base58Letters = exports.visibleLetters = exports.lowerCaseLetters = exports.upperCaseLetters = exports.digits = void 0;
exports.genStringRange = genStringRange;
const enum_1 = require("./enum");
const string_1 = require("./string");
/**
* @param start {number} inclusive
* @param end {number} exclusive
* */
function genStringRange(start, end) {
let s = '';
for (let i = start; i < end; i++) {
s += String.fromCharCode(i);
}
return s;
}
/** @description from '0' to '9' */
exports.digits = genStringRange(48, 48 + 10);
/** @description from 'A' to 'Z' */
exports.upperCaseLetters = genStringRange(65, 65 + 26);
/** @description from 'a' to 'z' */
exports.lowerCaseLetters = genStringRange(65 + 32, 65 + 32 + 26);
/** @description visible characters only in ascii range */
exports.visibleLetters = genStringRange(32, 127);
/** @description base58btc format, removed '0OIl' and '+/' */
exports.base58Letters = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
exports.symbolLetters = (0, string_1.str_minus)(exports.visibleLetters, exports.digits + exports.upperCaseLetters + exports.lowerCaseLetters);
/** @description upperCaseLetters + lowerCaseLetters + digits */
exports.alphabetNumLetters = exports.upperCaseLetters + exports.lowerCaseLetters + exports.digits;
var Random;
(function (Random) {
/**
* @param {number} upper defaults to Number.MAX_SAFE_INTEGER
* @param {number} lower defaults to 0
* @returns {number} integer, lower <= value < upper
*/
function nextInt(upper = Number.MAX_SAFE_INTEGER, lower = 0) {
return Math.floor(Math.random() * (upper - lower) + lower);
}
Random.nextInt = nextInt;
/**
* @param {number} upper defaults to Number.MAX_VALUE
* @param {number} lower defaults to 0
* @param {number} decimal defaults to 2
* @returns {number} integer or float, lower <= value < upper
*/
function nextFloat(upper = Number.MAX_VALUE, lower = 0, decimal = 2) {
const range = upper - lower;
const value_random = Math.random() * range + lower;
const value_int = Math.floor(value_random);
if (value_random == value_int) {
return value_random;
}
const value_decimal = value_random - value_int;
const value_decimal_str = value_decimal.toString().slice(2, 2 + decimal);
return +(value_int + '.' + value_decimal_str);
}
Random.nextFloat = nextFloat;
/**
* @param {number} prob defaults to 0.5
* @returns {boolean} boolean with prob chance being true
*/
function nextBool(prob = 0.5) {
return Math.random() < prob;
}
Random.nextBool = nextBool;
function probablyRun(prop, run) {
if (nextBool(prop)) {
return run();
}
}
Random.probablyRun = probablyRun;
/** @returns real number : -1 .. 1 */
function nextNP1() {
return Math.random() * 2 - 1;
}
Random.nextNP1 = nextNP1;
function element(xs) {
if (xs.length == 0) {
throw new Error(typeof xs == 'string'
? 'cannot random pick from empty string'
: 'cannot random pick from empty array');
}
const idx = Math.floor(Math.random() * xs.length);
return xs[idx];
}
Random.element = element;
function nextDate(after = new Date('2016-12-12'), before = new Date('2018-12-12')) {
const diff = before.getTime() - after.getTime();
const time = Random.nextInt(after.getTime() + diff, after.getTime());
return new Date(time);
}
Random.nextDate = nextDate;
/**
* @return value of enum (not key of enum)
* */
function nextEnum(e) {
const key = Random.element((0, enum_1.enum_keys)(e));
return e[key];
}
Random.nextEnum = nextEnum;
function nextEnumKey(e) {
return Random.element((0, enum_1.enum_keys)(e));
}
Random.nextEnumKey = nextEnumKey;
function nextBuffer(n) {
const res = Buffer.alloc(n);
for (let i = 0; i < n; i++) {
res[i] = (Math.random() * 256) >>> 0;
}
return res;
}
Random.nextBuffer = nextBuffer;
/**
* @param {number} n length of string to be generated
* @param {string} pool candidate characters, defaults to visibleLetters
* @returns string random generated characters, possible to have repeating characters
*/
function nextString(n, pool = exports.visibleLetters) {
let s = '';
for (; s.length < n;) {
s += element(pool);
}
return s;
}
Random.nextString = nextString;
})(Random || (exports.Random = Random = {}));