UNPKG

4.73 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
8
9exports.minMaxOfRange = minMaxOfRange;
10exports.reduceRange = reduceRange;
11exports.iterateRange = iterateRange;
12
13function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
14
15/**
16 * @external {Range} https://github.com/Reading-eScience-Centre/coverage-jsapi/blob/master/Range.md
17 */
18
19/**
20 * Return the minimum/maximum across all range values, ignoring null's.
21 *
22 * @param {Range<number>} range The numeric coverage data range.
23 * @return {[min,max]} The minimum and maximum values of the range,
24 * or [undefined, undefined] if the range contains only `null` values.
25 */
26function minMaxOfRange(range) {
27 var min = Infinity;
28 var max = -Infinity;
29 var fn = function fn(val) {
30 if (val === null) return;
31 if (val < min) min = val;
32 if (val > max) max = val;
33 };
34 iterateRange(range, fn);
35 return min === Infinity ? [undefined, undefined] : [min, max];
36}
37
38/**
39 * Apply a reduce function over the range values.
40 *
41 * @param {Range} range The coverage data range.
42 * @param {function} callback Function to execute on each value in the array with arguments `(previousValue, currentValue)`.
43 * @param start Value to use as the first argument to the first call of the `callback`.
44 * @return The reduced value.
45 */
46function reduceRange(range, callback, start) {
47 var v1 = start;
48 var iterFn = function iterFn(v2) {
49 v1 = callback(v1, v2);
50 };
51 iterateRange(range, iterFn);
52 return v1;
53}
54
55/**
56 * Iterate over all range values and run a function for each value.
57 * No particular iteration order must be assumed.
58 */
59function iterateRange(range, fn) {
60 // We use a precompiled function here for efficiency.
61 // See below for a slower recursive version.
62
63 // Benchmarks compared to recursive version:
64 // Chrome 46: around 1.03x faster
65 // Firefox 42: around 2x faster (and around 6x faster than Chrome 46!)
66
67 // nest loops from smallest to biggest
68 var shape = [].concat(_toConsumableArray(range.shape));
69 shape.sort(function (_ref, _ref2) {
70 var _ref4 = _slicedToArray(_ref, 2);
71
72 var size1 = _ref4[1];
73
74 var _ref3 = _slicedToArray(_ref2, 2);
75
76 var size2 = _ref3[1];
77 return size1 - size2;
78 });
79
80 var begin = 'var obj = {}';
81 var end = '';
82 var _iteratorNormalCompletion = true;
83 var _didIteratorError = false;
84 var _iteratorError = undefined;
85
86 try {
87 for (var _iterator = shape[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
88 var _step$value = _slicedToArray(_step.value, 2);
89
90 var axis = _step$value[0];
91 var size = _step$value[1];
92
93 begin += '\n for (var i' + axis + '=0; i' + axis + ' < ' + size + '; ++i' + axis + ') {\n obj[\'' + axis + '\'] = i' + axis + '\n ';
94 end += '}';
95 }
96 } catch (err) {
97 _didIteratorError = true;
98 _iteratorError = err;
99 } finally {
100 try {
101 if (!_iteratorNormalCompletion && _iterator.return) {
102 _iterator.return();
103 }
104 } finally {
105 if (_didIteratorError) {
106 throw _iteratorError;
107 }
108 }
109 }
110
111 begin += '\n fn(get(obj))\n ';
112
113 var iterateLoop = new Function('return function iterRange (get, fn) { ' + begin + ' ' + end + ' }')(); // eslint-disable-line
114 iterateLoop(range.get, fn);
115}
116
117/*
118 * Recursive version of iterate(). For reference only.
119 *
120export function iterate (range, fn) {
121 let get = range.get
122 let shape = [...range.shape]
123 // iterate from smallest to biggest dimension
124 shape.sort(([,size1], [,size2]) => size1 - size2)
125 let dims = shape.length
126
127 function iterateRecurse (obj, axisIdx) {
128 if (dims === axisIdx) {
129 fn(get(obj))
130 } else {
131 let [axis,size] = shape[axisIdx]
132 for (let i=0; i < size; i++) {
133 obj[axis] = i
134 iterateRecurse(obj, axisIdx+1)
135 }
136 }
137 }
138 iterateRecurse({}, 0)
139}
140*/
\No newline at end of file