You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.4 KiB
54 lines
1.4 KiB
'use strict'; |
|
module.exports = { |
|
wrap: wrapRange, |
|
limit: limitRange, |
|
validate: validateRange, |
|
test: testRange, |
|
curry: curry, |
|
name: name |
|
}; |
|
|
|
function wrapRange(min, max, value) { |
|
var maxLessMin = max - min; |
|
return ((value - min) % maxLessMin + maxLessMin) % maxLessMin + min; |
|
} |
|
|
|
function limitRange(min, max, value) { |
|
return Math.max(min, Math.min(max, value)); |
|
} |
|
|
|
function validateRange(min, max, value, minExclusive, maxExclusive) { |
|
if (!testRange(min, max, value, minExclusive, maxExclusive)) { |
|
throw new Error(value + ' is outside of range [' + min + ',' + max + ')'); |
|
} |
|
return value; |
|
} |
|
|
|
function testRange(min, max, value, minExclusive, maxExclusive) { |
|
return !( |
|
value < min || |
|
value > max || |
|
(maxExclusive && (value === max)) || |
|
(minExclusive && (value === min)) |
|
); |
|
} |
|
|
|
function name(min, max, minExcl, maxExcl) { |
|
return (minExcl ? '(' : '[') + min + ',' + max + (maxExcl ? ')' : ']'); |
|
} |
|
|
|
function curry(min, max, minExclusive, maxExclusive) { |
|
var boundNameFn = name.bind(null, min, max, minExclusive, maxExclusive); |
|
return { |
|
wrap: wrapRange.bind(null, min, max), |
|
limit: limitRange.bind(null, min, max), |
|
validate: function(value) { |
|
return validateRange(min, max, value, minExclusive, maxExclusive); |
|
}, |
|
test: function(value) { |
|
return testRange(min, max, value, minExclusive, maxExclusive); |
|
}, |
|
toString: boundNameFn, |
|
name: boundNameFn |
|
}; |
|
}
|
|
|