var stream_sort = (function () { var exports = {}; var previous_pinned; var previous_normal; var previous_dormant; var all_streams = []; exports.get_streams = function () { // Right now this is only used for testing, but we should // use it for things like hotkeys that cycle through streams. return all_streams; }; function filter_streams_by_search(streams, search_term) { if (search_term === '') { return streams; } var search_terms = search_term.toLowerCase().split(","); search_terms = _.map(search_terms, function (s) { return s.trim(); }); var filtered_streams = _.filter(streams, function (stream) { return _.any(search_terms, function (search_term) { var lower_stream_name = stream.toLowerCase(); var cands = lower_stream_name.split(" "); cands.push(lower_stream_name); return _.any(cands, function (name) { return name.indexOf(search_term) === 0; }); }); }); return filtered_streams; } exports.sort_groups = function (search_term) { var streams = stream_data.subscribed_streams(); if (streams.length === 0) { return; } streams = filter_streams_by_search(streams, search_term); function is_normal(sub) { return stream_data.is_active(sub); } var pinned_streams = []; var normal_streams = []; var dormant_streams = []; _.each(streams, function (stream) { var sub = stream_data.get_sub(stream); var pinned = sub.pin_to_top; if (pinned) { pinned_streams.push(stream); } else if (is_normal(sub)) { normal_streams.push(stream); } else { dormant_streams.push(stream); } }); pinned_streams.sort(util.strcmp); normal_streams.sort(util.strcmp); dormant_streams.sort(util.strcmp); var same_as_before = previous_pinned !== undefined && util.array_compare(previous_pinned, pinned_streams) && util.array_compare(previous_normal, normal_streams) && util.array_compare(previous_dormant, dormant_streams); if (!same_as_before) { previous_pinned = pinned_streams; previous_normal = normal_streams; previous_dormant = dormant_streams; all_streams = pinned_streams.concat(normal_streams, dormant_streams); } return { same_as_before: same_as_before, pinned_streams: pinned_streams, normal_streams: normal_streams, dormant_streams: dormant_streams, }; }; function pos(stream_id) { var sub = stream_data.get_sub_by_id(stream_id); var name = sub.name; var i = all_streams.indexOf(name); if (i < 0) { return; } return i; } function maybe_get_stream_id(i) { if (i < 0 || i >= all_streams.length) { return; } var name = all_streams[i]; var stream_id = stream_data.get_stream_id(name); return stream_id; } exports.first_stream_id = function () { return maybe_get_stream_id(0); }; exports.prev_stream_id = function (stream_id) { var i = pos(stream_id); if (i === undefined) { return; } return maybe_get_stream_id(i - 1); }; exports.next_stream_id = function (stream_id) { var i = pos(stream_id); if (i === undefined) { return; } return maybe_get_stream_id(i + 1); }; return exports; }()); if (typeof module !== 'undefined') { module.exports = stream_sort; }