5 validate: validateRange,
11 function wrapRange(min, max, value) {
12 var maxLessMin = max - min;
13 return ((value - min) % maxLessMin + maxLessMin) % maxLessMin + min;
16 function limitRange(min, max, value) {
17 return Math.max(min, Math.min(max, value));
20 function validateRange(min, max, value, minExclusive, maxExclusive) {
21 if (!testRange(min, max, value, minExclusive, maxExclusive)) {
22 throw new Error(value + ' is outside of range [' + min + ',' + max + ')');
27 function testRange(min, max, value, minExclusive, maxExclusive) {
31 (maxExclusive && (value === max)) ||
32 (minExclusive && (value === min))
36 function name(min, max, minExcl, maxExcl) {
37 return (minExcl ? '(' : '[') + min + ',' + max + (maxExcl ? ')' : ']');
40 function curry(min, max, minExclusive, maxExclusive) {
41 var boundNameFn = name.bind(null, min, max, minExclusive, maxExclusive);
43 wrap: wrapRange.bind(null, min, max),
44 limit: limitRange.bind(null, min, max),
45 validate: function(value) {
46 return validateRange(min, max, value, minExclusive, maxExclusive);
48 test: function(value) {
49 return testRange(min, max, value, minExclusive, maxExclusive);
51 toString: boundNameFn,