diffusion
Version:
Diffusion JavaScript client
83 lines (61 loc) • 1.99 kB
JavaScript
var inherits = require('inherits');
var utils = require('topics/topic-path-utils');
var TopicSelector = require('../../selectors/topic-selector');
var DELIMITER = "////";
function extractCommonPrefix(selectors) {
if (selectors.length === 0) {
return "";
}
// Set initial value to Integer.MAX_VALUE
var minimum = 2147483647;
var prefixes = [], i = 0;
selectors.forEach(function(selector) {
var part = utils.split(selector.prefix);
minimum = Math.min(minimum, part.length);
prefixes[i++] = part;
});
var composite = [];
assembly:
for (var j = 0; j < minimum; ++j) {
var part = prefixes[0][j];
for (var k = 0; k < prefixes.length; ++k) {
if (part !== prefixes[k][j]) {
break assembly;
}
}
composite.push(part);
composite.push(utils.PATH_SEPARATOR);
}
return utils.canonicalise(composite.join(''));
}
function SelectorSet(selectors) {
var expanded = [];
selectors.forEach(function(selector) {
if (selector instanceof SelectorSet) {
selector.selectors.forEach(function(nested) {
expanded.push(nested);
});
} else {
expanded.push(selector);
}
});
this.selectors = expanded;
var remainder = expanded.join(DELIMITER);
var prefix = extractCommonPrefix(expanded);
TopicSelector.call(
this,
TopicSelector.Type.SELECTOR_SET,
prefix,
TopicSelector.Prefix.SELECTOR_SET + remainder);
}
SelectorSet.DELIMITER = DELIMITER;
inherits(SelectorSet, TopicSelector);
SelectorSet.prototype.selects = function(topicPath) {
for (var i = 0; i < this.selectors.length; ++i) {
if (this.selectors[i].selects(topicPath)) {
return true;
}
}
return false;
};
module.exports = SelectorSet;