NET-Web-API-w-Angular/my-app/node_modules/hdr-histogram-js/dist/JsHistogramIterator.js

99 lines
No EOL
4.3 KiB
JavaScript
Executable file

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const HistogramIterationValue_1 = require("./HistogramIterationValue");
/**
* Used for iterating through histogram values.
*/
class JsHistogramIterator /* implements Iterator<HistogramIterationValue> */ {
constructor() {
this.currentIterationValue = new HistogramIterationValue_1.default();
}
resetIterator(histogram) {
this.histogram = histogram;
this.savedHistogramTotalRawCount = histogram.totalCount;
this.arrayTotalCount = histogram.totalCount;
this.currentIndex = 0;
this.currentValueAtIndex = 0;
this.nextValueAtIndex = Math.pow(2, histogram.unitMagnitude);
this.prevValueIteratedTo = 0;
this.totalCountToPrevIndex = 0;
this.totalCountToCurrentIndex = 0;
this.totalValueToCurrentIndex = 0;
this.countAtThisValue = 0;
this.freshSubBucket = true;
this.currentIterationValue.reset();
}
/**
* Returns true if the iteration has more elements. (In other words, returns true if next would return an
* element rather than throwing an exception.)
*
* @return true if the iterator has more elements.
*/
hasNext() {
if (this.histogram.totalCount !== this.savedHistogramTotalRawCount) {
throw "Concurrent Modification Exception";
}
return this.totalCountToCurrentIndex < this.arrayTotalCount;
}
/**
* Returns the next element in the iteration.
*
* @return the {@link HistogramIterationValue} associated with the next element in the iteration.
*/
next() {
// Move through the sub buckets and buckets until we hit the next reporting level:
while (!this.exhaustedSubBuckets()) {
this.countAtThisValue = this.histogram.getCountAtIndex(this.currentIndex);
if (this.freshSubBucket) {
// Don't add unless we've incremented since last bucket...
this.totalCountToCurrentIndex += this.countAtThisValue;
this.totalValueToCurrentIndex +=
this.countAtThisValue *
this.histogram.highestEquivalentValue(this.currentValueAtIndex);
this.freshSubBucket = false;
}
if (this.reachedIterationLevel()) {
const valueIteratedTo = this.getValueIteratedTo();
Object.assign(this.currentIterationValue, {
valueIteratedTo,
valueIteratedFrom: this.prevValueIteratedTo,
countAtValueIteratedTo: this.countAtThisValue,
countAddedInThisIterationStep: this.totalCountToCurrentIndex - this.totalCountToPrevIndex,
totalCountToThisValue: this.totalCountToCurrentIndex,
totalValueToThisValue: this.totalValueToCurrentIndex,
percentile: (100 * this.totalCountToCurrentIndex) / this.arrayTotalCount,
percentileLevelIteratedTo: this.getPercentileIteratedTo(),
});
this.prevValueIteratedTo = valueIteratedTo;
this.totalCountToPrevIndex = this.totalCountToCurrentIndex;
this.incrementIterationLevel();
if (this.histogram.totalCount !== this.savedHistogramTotalRawCount) {
throw new Error("Concurrent Modification Exception");
}
return this.currentIterationValue;
}
this.incrementSubBucket();
}
throw new Error("Index Out Of Bounds Exception");
}
getPercentileIteratedTo() {
return (100 * this.totalCountToCurrentIndex) / this.arrayTotalCount;
}
getPercentileIteratedFrom() {
return (100 * this.totalCountToPrevIndex) / this.arrayTotalCount;
}
getValueIteratedTo() {
return this.histogram.highestEquivalentValue(this.currentValueAtIndex);
}
exhaustedSubBuckets() {
return this.currentIndex >= this.histogram.countsArrayLength;
}
incrementSubBucket() {
this.freshSubBucket = true;
this.currentIndex++;
this.currentValueAtIndex = this.histogram.valueFromIndex(this.currentIndex);
this.nextValueAtIndex = this.histogram.valueFromIndex(this.currentIndex + 1);
}
}
exports.default = JsHistogramIterator;
//# sourceMappingURL=JsHistogramIterator.js.map