121 lines
3.9 KiB
JavaScript
121 lines
3.9 KiB
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);
|