UNPKG

basicprimitives

Version:

Basic Primitives Diagrams for JavaScript - data visualization components library that implements organizational chart and multi-parent dependency diagrams, contains implementations of JavaScript Controls and PDF rendering plugins.

69 lines (61 loc) 1.98 kB
import Interval from '../graphics/structs/Interval'; function IntervalPoint(value, index, isStart) { this.value = value; this.index = index; this.isStart = isStart; } /** * Callback function to iterate over result intervals * * @callback onMergedIntervalItemCallback * @param {Interval} interval Merged interval * @param {Object} context First interval context. */ /** * Merges collection of overlapping intervals into continuous group of intervals. Calls callback * function to pass result interval per group of overlapping intervals. * * @param {Object} thisArg The callback function invocation context * @param {Interval[]} items Collection of intervals. * @param {onMergedIntervalItemCallback} onItem Callback function to pass result group of merged intervals. */ export default function getMergedIntervals(thisArg, items, onItem) { var points = []; for(var index = 0; index < items.length; index+=1) { var item = items[index]; points.push(new IntervalPoint(item.from, index, true)); points.push(new IntervalPoint(item.to, index, false)); } points.sort(function(a, b) { if(a.value === b.value) { return b.isStart - a.isStart; } return a.value - b.value; }) var counter = 0; var interval = null; var logicalIndex = null; for(var index = 0, len = points.length; index < len; index+=1) { var point = points[index]; if(interval == null) { interval = new Interval(items[point.index]); } interval.to = point.value; if(point.isStart) { counter++; if(logicalIndex === null || logicalIndex > point.index) { logicalIndex = point.index; interval.context = items[point.index].context; } } else { counter--; } if(!counter) { if(onItem != null) { onItem.call(thisArg, interval); } interval = null; logicalIndex = null; } } };