| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 | | '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 |  |   }; |  | } | 
 |