43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
function distribute(val, minOld, maxOld, minNew, maxNew) {
|
|
let scalar = (val - minOld) / (maxOld - minOld);
|
|
return minNew + ((maxNew - minNew) * scalar);
|
|
}
|
|
|
|
function Distributor(capacity) {
|
|
this.cap = capacity;
|
|
|
|
this.reset = () => {
|
|
this.arr = [];
|
|
this.arrSorted = [];
|
|
this.length = 0;
|
|
};
|
|
this.reset();
|
|
|
|
// add adds the given value into the series, shifting off the oldest value if
|
|
// the series is at capacity.
|
|
this.add = (val) => {
|
|
this.arr.push(val);
|
|
if (this.arr.length >= this.cap) this.arr.shift();
|
|
this.arrSorted = this.arr.slice(); // copy array
|
|
this.arrSorted.sort();
|
|
this.length = this.arr.length;
|
|
};
|
|
|
|
// distribute finds where the given value falls within the series, and then
|
|
// scales that into the given range (inclusive).
|
|
this.distribute = (val, min, max) => {
|
|
if (this.length == 0) throw "cannot locate within empty Distributor";
|
|
|
|
let idx = this.length;
|
|
for (i in this.arrSorted) {
|
|
if (val < this.arrSorted[i]) {
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return distribute(idx, 0, this.length, min, max);
|
|
};
|
|
}
|
|
|