2 * (C) Copyright 2004-2007 Shawn Betts
3 * (C) Copyright 2007-2009 John J. Foerch
4 * (C) Copyright 2007-2008 Jeremy Maitin-Shepard
6 * Use, modification, and distribution are subject to the terms specified in the
11 /* remove_duplicates_filter returns a function that can be
12 * used in Array.filter. It removes duplicates.
14 function remove_duplicates_filter () {
17 if (acc[x]) return false;
25 * Given an array, switches places on the subarrays at index i1 to i2 and j1 to
26 * j2. Leaves the rest of the array unchanged.
28 function switch_subarrays (arr, i1, i2, j1, j2) {
29 return arr.slice(0, i1) +
33 arr.slice(j2, arr.length);
38 * splice_ranges: Given an ordered array of non-overlapping ranges,
39 * represented as elements of [start, end], insert a new range into the
40 * array, extending, replacing, or merging existing ranges as needed.
41 * Mutates `arr' in place, but returns the reference to it.
45 * splice_range([[1,3],[4,6], 5, 8)
48 * splice_range([[1,3],[4,6],[7,10]], 2, 8)
51 function splice_range (arr, start, end) {
52 for (var i = 0; i < arr.length; ++i) {
57 arr.splice(i, 0, [start, end]);
65 * The range we are inserting overlaps the current
66 * range. We need to scan right to see if it also contains any other
67 * ranges entirely, and remove them if necessary.
70 while (j < arr.length && end >= arr[j][0])
73 arr[i][1] = Math.max(end, arr[j][1]);
74 arr.splice(i + 1, j - i);
78 if (start > arr[arr.length - 1][1])
79 arr.push([start, end]);