const { MetricTypes } = require('./Metric');
/**
* Counters are things that increment or decrement
* @implements {Metric}
* @example
* var Measured = require('measured')
* var activeUploads = new Measured.Counter();
* http.createServer(function(req, res) {
* activeUploads.inc();
* req.on('end', function() {
* activeUploads.dec();
* });
* });
*/
class Counter {
/**
* @param {CounterProperties} [properties] see {@link CounterProperties}
*/
constructor(properties) {
properties = properties || {};
this._count = properties.count || 0;
}
/**
* Counters directly return their currently value.
* @return {number}
*/
toJSON() {
return this._count;
}
/**
* Increments the counter.
* @param {number} n Increment the counter by n. Defaults to 1.
*/
inc(n) {
this._count += arguments.length ? n : 1;
}
/**
* Decrements the counter
* @param {number} n Decrement the counter by n. Defaults to 1.
*/
dec(n) {
this._count -= arguments.length ? n : 1;
}
/**
* Resets the counter back to count Defaults to 0.
* @param {number} count Resets the counter back to count Defaults to 0.
*/
reset(count) {
this._count = count || 0;
}
/**
* The type of the Metric Impl. {@link MetricTypes}.
* @return {string} The type of the Metric Impl.
*/
getType() {
return MetricTypes.COUNTER;
}
}
module.exports = Counter;
/**
* Properties that can be supplied to the constructor of a {@link Counter}
*
* @interface CounterProperties
* @typedef CounterProperties
* @type {Object}
* @property {number} count An initial count for the counter. Defaults to 0.
* @example
* // Creates a counter that starts at 5.
* const counter = new Counter({ count: 5 })
*/