UNPKG

diffusion

Version:

Diffusion JavaScript client

83 lines (61 loc) 1.99 kB
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;