stochator
Version:
A tiny library providing for creating a variety of random value generators.
460 lines (385 loc) • 15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _lodashIdentity = require("lodash.identity");
var _lodashIdentity2 = _interopRequireDefault(_lodashIdentity);
var _lodashIsfunction = require("lodash.isfunction");
var _lodashIsfunction2 = _interopRequireDefault(_lodashIsfunction);
var _lodashIsregexp = require("lodash.isregexp");
var _lodashIsregexp2 = _interopRequireDefault(_lodashIsregexp);
var _lodashIsstring = require("lodash.isstring");
var _lodashIsstring2 = _interopRequireDefault(_lodashIsstring);
var _lodashRange = require("lodash.range");
var _lodashRange2 = _interopRequireDefault(_lodashRange);
var _boolean = require("./boolean");
var _boolean2 = _interopRequireDefault(_boolean);
var _color = require("./color");
var _color2 = _interopRequireDefault(_color);
var _distribution = require("./distribution");
var _distribution2 = _interopRequireDefault(_distribution);
var _float = require("./float");
var _float2 = _interopRequireDefault(_float);
var _integer = require("./integer");
var _integer2 = _interopRequireDefault(_integer);
var _seedrandom = require("seedrandom");
var _seedrandom2 = _interopRequireDefault(_seedrandom);
var _set = require("./set");
var _set2 = _interopRequireDefault(_set);
var _string = require("./string");
var _string2 = _interopRequireDefault(_string);
var booleanGenerator = function booleanGenerator(_ref2) {
var prng = _ref2.prng;
return function () {
return _boolean2["default"].random(prng);
};
};
var colorGenerator = function colorGenerator(_ref3) {
var prng = _ref3.prng;
return function () {
return _color2["default"].randomRgb(prng);
};
};
var floatGenerator = function floatGenerator(_ref4) {
var min = _ref4.min;
var max = _ref4.max;
var mean = _ref4.mean;
var prng = _ref4.prng;
var stdev = _ref4.stdev;
if (mean && stdev) {
return function () {
return _distribution2["default"].randomNormallyDistributedFloat(mean, stdev, min, max, prng);
};
} else {
return function () {
return _float2["default"].boundedRandom(min, max, prng);
};
}
};
var integerGenerator = function integerGenerator(_ref5) {
var min = _ref5.min;
var max = _ref5.max;
var prng = _ref5.prng;
return function () {
return _integer2["default"].boundedRandom(min, max, prng);
};
};
var setGenerator = function setGenerator(_ref6) {
var values = _ref6.values;
var prng = _ref6.prng;
var _ref6$replacement = _ref6.replacement;
var replacement = _ref6$replacement === undefined ? true : _ref6$replacement;
var _ref6$shuffle = _ref6.shuffle;
var shuffle = _ref6$shuffle === undefined ? false : _ref6$shuffle;
var _ref6$weights = _ref6.weights;
var weights = _ref6$weights === undefined ? null : _ref6$weights;
if (!values || !values.length) {
throw Error("Must provide a 'values' array for a set generator.");
}
if (shuffle) {
return function () {
return _set2["default"].shuffle(values, prng);
};
} else if (replacement) {
if (weights) {
return function () {
return _set2["default"].weightedRandomMember(values, weights, prng);
};
} else {
return function () {
return _set2["default"].randomMember(values, prng);
};
}
} else {
return function () {
return _set2["default"].randomMemberWithoutReplacement(values, prng);
};
}
};
var stringGenerator = function stringGenerator(_ref7) {
var kind = _ref7.kind;
var _ref7$expression = _ref7.expression;
var expression = _ref7$expression === undefined ? "[" + kind + "]" : _ref7$expression;
var _ref7$ignoreCase = _ref7.ignoreCase;
var ignoreCase = _ref7$ignoreCase === undefined ? false : _ref7$ignoreCase;
var _ref7$maxWildcard = _ref7.maxWildcard;
var maxWildcard = _ref7$maxWildcard === undefined ? 100 : _ref7$maxWildcard;
var prng = _ref7.prng;
var _ref7$unicode = _ref7.unicode;
var unicode = _ref7$unicode === undefined ? false : _ref7$unicode;
return (function () {
var isRe = (0, _lodashIsregexp2["default"])(expression);
var exprSource = isRe ? expression.source : expression;
var options = {
ignoreCase: ignoreCase || isRe && expression.ignoreCase,
maxWildcard: maxWildcard,
prng: prng
};
return _string2["default"].generateString(unicode, exprSource, options);
})();
};
var KIND_GENERATORS = {
"boolean": booleanGenerator,
"float": floatGenerator,
"integer": integerGenerator,
"set": setGenerator,
"color": colorGenerator,
"rgb": colorGenerator,
"string": stringGenerator,
"a-z": stringGenerator,
"A-Z": stringGenerator
};
var VALID_KINDS = Object.keys(KIND_GENERATORS);
var validateKind = function validateKind(kind) {
if (VALID_KINDS.indexOf(kind) !== -1) {
return true;
}
throw Error(kind + " is in invalid kind. Valid kinds include:\n " + VALID_KINDS.join(', '));
};
var getConfigWithDefaults = function getConfigWithDefaults(rawConfig) {
return _extends({ kind: "float" }, rawConfig, { prng: getPrng(rawConfig) });
};
var createGenerator = function createGenerator(rawConfig) {
var config = getConfigWithDefaults(rawConfig);
validateKind(config.kind);
return KIND_GENERATORS[config.kind](config);
};
var getNextValueGenerator = function getNextValueGenerator(configs) {
configs[0] = configs[0] ? configs[0] : {};
var generators = (function () {
var _generators = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = configs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var config = _step.value;
_generators.push(createGenerator(config));
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"]) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return _generators;
})();
if (generators.length === 1) {
return function () {
return generators[0]();
};
} else {
return function () {
return (function () {
var _ref = [];
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = generators[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var generator = _step2.value;
_ref.push(generator());
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2["return"]) {
_iterator2["return"]();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return _ref;
})();
};
}
};
var getPrng = function getPrng(_ref8) {
var seed = _ref8.seed;
var prng = _ref8.prng;
var defaultPrng = seed ? _seedrandom2["default"] : Math.random;
var basePrng = prng ? prng : defaultPrng;
return seed ? basePrng(seed) : basePrng;
};
var parseArgs = function parseArgs(args) {
var defaults = { configs: [], mutator: null, name: null };
return args.reduce(function (result, arg) {
if (result.mutator || (0, _lodashIsstring2["default"])(arg)) {
result.name = arg;
} else if ((0, _lodashIsfunction2["default"])(arg)) {
result.mutator = arg;
} else {
result.configs.push(arg);
}
return result;
}, defaults);
};
var Stochator = (function () {
_createClass(Stochator, null, [{
key: "fromDistribution",
value: {
normal: _distribution2["default"].randomNormallyDistributedFloat
},
enumerable: true
}, {
key: "randomAsciiCharacter",
value: _string2["default"].randomAsciiCharacter,
enumerable: true
}, {
key: "randomAsciiString",
value: _string2["default"].randomAsciiString,
enumerable: true
}, {
key: "randomBoolean",
value: _boolean2["default"].random,
enumerable: true
}, {
key: "randomByte",
value: _integer2["default"].randomByte,
enumerable: true
}, {
key: "randomCharacterFromRange",
value: _string2["default"].randomCharacterFromRange,
enumerable: true
}, {
key: "randomColor",
value: _color2["default"].randomRgb,
enumerable: true
}, {
key: "randomFloat",
value: _float2["default"].boundedRandom,
enumerable: true
}, {
key: "randomInteger",
value: _integer2["default"].boundedRandom,
enumerable: true
}, {
key: "randomLowercaseCharacter",
value: _string2["default"].randomLowercaseCharacter,
enumerable: true
}, {
key: "randomSetMember",
value: _set2["default"].randomMember,
enumerable: true
}, {
key: "randomSetMemberWithoutReplacement",
value: _set2["default"].randomMemberWithoutReplacement,
enumerable: true
}, {
key: "randomUnicodeCharacter",
value: _string2["default"].randomUnicodeCharacter,
enumerable: true
}, {
key: "randomUnicodeString",
value: _string2["default"].randomUnicodeString,
enumerable: true
}, {
key: "randomUppercaseCharacter",
value: _string2["default"].randomUppercaseCharacter,
enumerable: true
}, {
key: "shuffleSet",
value: _set2["default"].shuffleSet,
enumerable: true
}, {
key: "weightedRandomSetMember",
value: _set2["default"].weightedRandomMember,
enumerable: true
}]);
function Stochator() {
var _this = this;
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_classCallCheck(this, Stochator);
this.VERSION = "0.6";
this._value = 0;
var _parseArgs = parseArgs(args);
var configs = _parseArgs.configs;
var mutator = _parseArgs.mutator;
var name = _parseArgs.name;
// If the mutator is provided, override the default identity func.
this.mutate = mutator ? function (nextValue) {
return mutator(nextValue, _this.getValue());
} : _lodashIdentity2["default"];
// Transform the configs to a func to get the next value.
var getNext = getNextValueGenerator(configs);
// Assign `name` to the next mutated value(s), after `times` iterations.
// If `times` is 1, just return the value, otherwise return an array.
this.next = function () {
var times = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];
var values = (function () {
var _values = [];
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = (0, _lodashRange2["default"])(1, times + 1)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var time = _step3.value;
_values.push(_this.setValue(_this.mutate(getNext())));
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3["return"]) {
_iterator3["return"]();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
return _values;
})();
return times == 1 ? values[0] : values;
};
if (name) {
this[name] = function () {
return _this.next.apply(_this, arguments);
};
}
}
_createClass(Stochator, [{
key: "getValue",
value: function getValue() {
return this._value;
}
}, {
key: "setValue",
value: function setValue(value) {
this._value = value;
return this._value;
}
}, {
key: "toString",
value: function toString() {
return "[object Stochator]";
}
}]);
return Stochator;
})();
exports["default"] = Stochator;
if (global) {
global.Stochator = Stochator;
}
module.exports = exports["default"];