1
0
Fork 0
mirror of https://github.com/Oreolek/raconteur.git synced 2024-05-17 00:08:16 +03:00

Add "stringish" functionality to OneOf iterators

This commit is contained in:
Bruno Dias 2015-04-12 15:07:59 -03:00
parent c8db44aa9b
commit 6ef13e2094

View file

@ -69,36 +69,49 @@ Array.prototype.shuffle = function (system) {
consistent randomness.
*/
var oneOf = function (ary) {
/*
Takes a function and gives it a toString() property that calls itself and
returns its value, allowing for ambiguous use of the closure object
as a text snippet.
Returns the modified function.
*/
var stringish = function (callback) {
callback.toString = function () { return '' + this.call() };
return callback;
}
var oneOf = function (...ary) {
return {
inOrder () {
var i = 0;
return function () {
return stringish(function () {
if (i >= ary.length) return null;
return ary[i++];
};
});
},
cycling () {
var i = 0;
return function () {
return stringish(function () {
if (i >= ary.length) i = 0;
return ary[i++];
};
});
},
stopping () {
var i = 0;
return function () {
return stringish(function () {
if (i >= ary.length) i = ary.length - 1;
return ary[i++];
}
});
},
randomly (system) {
var rng = (system) ? system.random : Math.random,
last;
return function () {
return stringish(function () {
var i;
do {
@ -107,22 +120,22 @@ var oneOf = function (ary) {
last = i;
return ary[i];
};
});
},
trulyAtRandom (system) {
var rng = (system) ? system.random : Math.random;
return function () {
return stringish(function () {
return ary[Math.floor(rng() * ary.length)];
};
});
},
inRandomOrder (system) {
var shuffled = ary.shuffle(system),
i = 0;
return function () {
return stringish(function () {
return shuffled[i++];
};
});
}
};
};