/
xrange.js
87 lines (68 loc) · 2.03 KB
/
xrange.js
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(function () {
var XRange = function (start, finish, by) {
this.length = Math.ceil((finish - start) / by);
this.map = function (callback) {
/**
* Create array by executing `map` on each value.
*/
var results = [];
var cmp = function (i, finish) {
if (start < finish) {
return i < finish;
} else {
return i > finish;
}
};
for (var i = start; cmp(i, finish); i += by) {
results.push(callback(i));
}
return results;
};
this.each = this.forEach = function (callback) {
/**
* Call `callback` on each item.
*
* If `callback` is false, stops loop.
*/
for (var i = start; i < finish; i += by) {
if (callback(i) === false) {
break;
}
}
};
this.toArray = function () {
/**
* Create array.
*/
return this.map(function (each) {
return each;
});
};
};
var factory = function (start, finish, by) {
/**
* Create xrange object.
*/
var args = Array.prototype.slice.call(arguments);
if (args.length === 1) {
finish = start;
start = 0;
}
if (args.length <= 2) {
by = finish > start ? 1 : -1;
}
if (by === 0) {
throw new TypeError('Cannot iterate by 0');
}
if ((start < finish && by < 0) || start > finish && by > 0) {
throw new TypeError('Cannot go from ' + start + ' to ' + finish +
' by ' + by);
}
return new XRange(start, finish, by);
};
if (typeof module !== 'undefined' && module.exports) {
module.exports = factory;
} else {
window.xrange = factory;
}
}());