|
|
- '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
- };
- }
|