/** * @prototype Range * * Helper class to make working with related min and max values easier. * * The range is inclusive; a given value is considered part of the range if: * * this.min <= value <= this.max */ function Range() { this.min = undefined; this.max = undefined; } /** * Adjust the range so that the passed value fits in it. * * If the value is outside of the current extremes, adjust * the min or max so that the value is within the range. * * @param {number} value Numeric value to fit in range */ Range.prototype.adjust = function(value) { if (value === undefined) return; if (this.min === undefined || this.min > value ) { this.min = value; } if (this.max === undefined || this.max < value) { this.max = value; } }; /** * Adjust the current range so that the passed range fits in it. * * @param {Range} range Range instance to fit in current instance */ Range.prototype.combine = function(range) { this.add(range.min); this.add(range.max); }; /** * Expand the range by the given value * * min will be lowered by given value; * max will be raised by given value * * Shrinking by passing a negative value is allowed. * * @param {number} val Amount by which to expand or shrink current range with */ Range.prototype.expand = function(val) { if (val === undefined) { return; } var newMin = this.min - val; var newMax = this.max + val; // Note that following allows newMin === newMax. // This should be OK, since method expand() allows this also. if (newMin > newMax) { throw new Error('Passed expansion value makes range invalid'); } this.min = newMin; this.max = newMax; }; /** * Determine the full range width of current instance. * * @returns {num} The calculated width of this range */ Range.prototype.range = function() { return this.max - this.min; }; /** * Determine the central point of current instance. * * @returns {number} the value in the middle of min and max */ Range.prototype.center = function() { return (this.min + this.max) / 2; }; module.exports = Range;