Show:
/* Copyright © 2015-2016 David Valdman */

define(function(require, exports, module) {
    var SimpleStream = require('../streams/SimpleStream');
    var preTickQueue = require('../core/queues/preTickQueue');
    var dirtyQueue = require('../core/queues/dirtyQueue');

    /**
     * An Observable is a stream for events set discretely in time, as opposed to continuously.
     *  It emits appropriate `start` and `end` events upon calling the `set` method.
     *
     * @class Observable
     * @constructor
     * @private
     * @extends Streams.Stream
     * @param value {Number, String, Array, Object} Value
     */
    function Observable(value){
        SimpleStream.call(this);
        this.value = value;

        if (value !== undefined) this.set(value);
    }

    Observable.prototype = Object.create(SimpleStream.prototype);
    Observable.prototype.constructor = Observable;

    /**
     * Getter for the provided value.
     *
     * @method get
     * @return {Number, String, Array, Object}
     */
    Observable.prototype.get = function(){
        return this.value;
    };

    /**
     * Setter for the provided value.
     *
     * @method set
     * @param value {Number, String, Array, Object} Value
     */
    Observable.prototype.set = function(value){
        var self = this;
        preTickQueue.push(function(){
            self.value = value;
            self.emit('start', value);

            dirtyQueue.push(function(){
                self.emit('end', value);
            });
        });
    };

    module.exports = Observable;
});