emissary
Version:
Utility mixins for subscribing to and emitting events.
121 lines (100 loc) • 3.98 kB
JavaScript
(function() {
var Behavior, PropertyAccessors, Signal, helpers, isEqual,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
__slice = [].slice;
isEqual = require('underscore-plus').isEqual;
PropertyAccessors = require('property-accessors');
Signal = require('./signal');
module.exports = Behavior = (function(_super) {
__extends(Behavior, _super);
PropertyAccessors.includeInto(Behavior);
function Behavior() {
var args, subscribeCallback, _ref;
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
if (typeof ((_ref = args[0]) != null ? _ref.call : void 0) !== 'function') {
this.value = args.shift();
}
Behavior.__super__.constructor.call(this, subscribeCallback = args.shift());
}
Behavior.prototype.retained = function() {
var _this = this;
this.subscribe(this, 'value-internal', function(value) {
return _this.value = value;
});
this.subscribe(this, 'value-subscription-added', function(handler) {
return handler(_this.value);
});
return typeof this.subscribeCallback === "function" ? this.subscribeCallback() : void 0;
};
Behavior.prototype.emit = function() {
var args, name;
name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
if (name === 'value') {
this.emit.apply(this, ['value-internal'].concat(__slice.call(args)));
}
return Behavior.__super__.emit.apply(this, arguments);
};
Behavior.prototype.getValue = function() {
if (!(this.retainCount > 0)) {
throw new Error("Subscribe to or retain this behavior before calling getValue");
}
return this.value;
};
Behavior.prototype.and = function(right) {
return helpers.combine(this, right, (function(leftValue, rightValue) {
return leftValue && rightValue;
})).distinctUntilChanged();
};
Behavior.prototype.or = function(right) {
return helpers.combine(this, right, (function(leftValue, rightValue) {
return leftValue || rightValue;
})).distinctUntilChanged();
};
Behavior.prototype.toBehavior = function() {
return this;
};
Behavior.prototype.lazyAccessor('changes', function() {
var source;
source = this;
return new Signal(function() {
var gotFirst,
_this = this;
gotFirst = false;
return this.subscribe(source, 'value', function() {
var metadata, value;
value = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
if (gotFirst) {
_this.emitValue.apply(_this, [value].concat(__slice.call(metadata)));
}
return gotFirst = true;
});
});
});
Behavior.prototype.becomes = function(predicateOrTargetValue) {
var predicate, targetValue;
if (typeof predicateOrTargetValue !== 'function') {
targetValue = predicateOrTargetValue;
return this.becomes(function(value) {
return isEqual(value, targetValue);
});
}
predicate = predicateOrTargetValue;
return this.map(function(value) {
return !!predicate(value);
}).distinctUntilChanged().changes;
};
Behavior.prototype.becomesLessThan = function(targetValue) {
return this.becomes(function(value) {
return value < targetValue;
});
};
Behavior.prototype.becomesGreaterThan = function(targetValue) {
return this.becomes(function(value) {
return value > targetValue;
});
};
return Behavior;
})(Signal);
helpers = require('./helpers');
}).call(this);