-
Notifications
You must be signed in to change notification settings - Fork 0
/
Utils.js
158 lines (147 loc) · 4.58 KB
/
Utils.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/**
* A library of utility functions necessary for proper operations
*/
var UTIL = UTIL || {};
/**
* Runs a function f on each element of an array
* @param {Array} arr An array of items to cycle through
* @param {Function} f A function of the form function(value) which takes as
* parameter a value from the array.
*/
UTIL.forEach = function forEach(arr, f) {
for(var i = 0; i < arr.length; i++)
f(arr[i], i);
}
/**
* Runs a function f on each property of an object
* @param {Object} obj The object through which this cycles
* @param {Function} f A function of the form function(propery, value) that
* defines an action to be taken for each property.
*/
UTIL.forEachIn = function forEachIn(obj, f) {
for(var property in obj) {
f(property, obj[property]);
}
}
/**
* Reduces an array to a single value by use of a function, combine.
* @param {Function} combine A function of the form function(base, element)
* which uses the previous value of combine (base) and a new value from the
* array to return a new value of combine.
* @param {Object} base The initial value from which combine should work
* @param {Array} array The array which should be combined
* @return {Object} the value of base after combine has been run on each
* element in the array.
*/
UTIL.reduce = function reduce(combine, base, array) {
forEach(array, function(element) {
base = combine(base, element);
});
return base;
}
/**
* Counts the number of elements for which a certain condition is true in an
* array.
* @param {Function} test a function of the form function(element) which
* returns true if the element meets the desired condition and false
* otherwise
* @param {Array} array The array in which to count elements that meet the
* condition
*/
UTIL.count = function count(test, array) {
reduce(function(base, element) {
return base + (test(element) ? 1 : 0);
}, 0, array);
}
/**
* Fills an array to new values defined by a function. Can accept either an
* existing array, in which case it is both modified and returned, or else a
* new array which is only returned.
* @param {Array} arr the array in which to define values, if null, a new
* array will be created.
* @param {Number} length The number of items to fill in the array
* @param {Function} f A function of the form function(index) which returns
* the desired value for each index of an array.
*/
UTIL.fillArray = function fillArray(arr, length, f) {
var arr = arr || new Array();
for(var i = 0; i < length; i++) {
arr[i] = f(i);
}
return arr;
}
UTIL.leastIndex = function leastIndex(arr, used) {
var least;
if(arguments.length > 1) {
for(var i = 0; i < arr.length && least == undefined; i++) {
if(!used[i]) least = arr[i];
}
}
else
least = arr[0] + 1;
var index = -1;
var usedFunction = function(val, i) {
if(least >= val && !used[i]) {
least = val;
index = i;
}
}
var otherFunction = function(val, i) {
if(least > val) {
least = val;
index = i;
}
}
UTIL.forEach(arr, arguments.length > 1 ? usedFunction : otherFunction);
return index;
}
UTIL.leastValue = function leastValue(arr, used) {
var least;
if(arguments.length > 1) {
for(var i = 0; i < arr.length && least == undefined; i++) {
if(!used[i]) least = arr[i];
}
}
else
least = arr[0] + 1;
var index = -1;
var usedFunction = function(val, i) {
if(least >= val && !used[i]) {
least = val;
index = i;
}
}
var otherFunction = function(val, i) {
if(least > val) {
least = val;
index = i;
}
}
UTIL.forEach(arr, arguments.length > 1 ? usedFunction : otherFunction);
return index == -1 ? null : least;
}
UTIL.greatestIndex = function greatestIndex(arr, used) {
var greatest;
if(arguments.length > 1) {
for(var i = 0; i < arr.length && greatest == undefined; i++) {
if(!used[i]) greatest = arr[i];
}
}
else
greatest = arr[0] + 1;
var index = -1;
var usedFunction = function(val, i) {
if(greatest <= val && !used[i]) {
greatest = val;
index = i;
}
}
var otherFunction = function(val, i) {
if(greatest <= val) {
greatest = val;
index = i;
}
}
UTIL.forEach(arr, arguments.length > 1 ? usedFunction : otherFunction);
return index;
}