/*
* Copyright 2014 Groupon.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* istanbul ignore next */ //ignores inheritance snippet emitted by the TS compiler
import tsdDef = require("tsdDef");
import tsd = require("tsd-metrics-client");
import sample = require("./tsd-metric-sample");
//aliases
import TsdMetricSample = sample.TsdMetricSample;
/**
* Class for counter. Instances are initialized to zero on creation. The zero-value sample is recorded when the
* [TsdMetrics]{@linkcode module:tsd-metrics-client~TsdMetrics} instance is closed if no other actions are taken on the
* Counter.
*
* Modifying the Counter instance's value modifies the single sample value. When the associated
* [TsdMetrics]{@linkcode module:tsd-metrics-client~TsdMetrics} instance is closed whatever value the sample has is
* recorded. To create another sample you create a new Counter instance with the same name.
*
* Each Counter instance is bound to a [TsdMetrics]{@linkcode module:tsd-metrics-client~TsdMetrics} instance. After the
* [TsdMetrics]{@linkcode module:tsd-metrics-client~TsdMetrics} instance is closed any modifications to the
* Counter instances bound to that [TsdMetrics]{@linkcode module:tsd-metrics-client~TsdMetrics} instance
* will be ignored.
*
* @class
* @extends MetricSample
* @alias Counter
* @author Mohammed Kamel (mkamel at groupon dot com)
*/
export class TsdCounter extends TsdMetricSample implements tsdDef.Counter {
/**
* Constructor.
*
* @param {MetricsStateObject} _metricsStateObject Object holding state of the parent metrics object.
* @ignore
*/
constructor(private _name:string, private _metricsStateObject:tsd.MetricsStateObject) {
super(0, undefined);
}
/**
* Increment the counter sample by the specified value.
*
* @method
* @param {number} value The value to increment the counter by. Default = 1
* @emits 'error' if the metrics object is closed
*/
public increment(value:number = 1):void {
if (this._metricsStateObject.assertIsOpen("Cannot increment/decrement counter '" + this._name + "'")) {
(this)._value = (this)._value + value;
}
}
/**
* Decrement the counter sample by the specified value.
*
* @method
* @param {number} value The value to decrement the counter by. Default = 1
* @emits 'error' if the metrics object is closed
*/
public decrement(value:number = 1):void {
this.increment(-1 * value);
}
}