/* Copyright © 2015-2016 David Valdman */
define(function(require, exports, module){
var Stream = require('../streams/Stream');
var OptionsManager = require('../core/OptionsManager');
/**
* Differential is a Stream that emits differentials of consecutive
* input values.
*
* It emits `start`, `update` and `end` events.
*
* @example
*
* var differential = new Differential();
* // this gives differentials of mouse input
* differential.subscribe(mouseInput.pluck('value'));
*
*
* @class Differential
* @extends Streams.Stream
* @uses Core.OptionsManager
* @namespace Streams
* @constructor
* @param [options] {Object} Options
* @param [options.scale] {Number} Scale to apply to differential
*/
function Differential(options){
this.options = OptionsManager.setOptions(this, options);
var previous = undefined;
var delta = undefined;
Stream.call(this, {
update: function () { return delta; }
});
this._eventInput.on('start', function (value) {
if (value instanceof Array)
previous = value.slice();
else previous = value;
});
this._eventInput.on('update', function (value) {
var scale = this.options.scale;
if (previous instanceof Array) {
delta = [];
for (var i = 0; i < previous.length; i++) {
delta[i] = scale * (value[i] - previous[i]);
previous[i] = value[i];
}
}
else {
delta = scale * (value - previous);
previous = value;
}
}.bind(this));
}
Differential.DEFAULT_OPTIONS = {
scale : 1
};
Differential.prototype = Object.create(Stream.prototype);
Differential.prototype.constructor = Differential;
module.exports = Differential;
});