2 * (C) Copyright 2004-2007 Shawn Betts
3 * (C) Copyright 2007-2010 John J. Foerch
4 * (C) Copyright 2007-2008 Jeremy Maitin-Shepard
6 * Use, modification, and distribution are subject to the terms specified in the
13 * array_p returns true if its argument is an array, otherwise false.
15 function array_p (ob) {
16 return ob && ob.constructor &&
17 ob.constructor.name == "Array" || false;
21 * make_array returns its argument unchanged if it is already an array, an
22 * empty array if its argument is undefined, otherwise an array containing
23 * its object as the sole element.
25 function make_array (ob) {
35 * array_find returns the first element in the given array that satisfies
36 * predicate p. returns null on failure.
38 function array_find (ar, p) {
39 for (var i = 0, n = ar.length; i < n; ++i) {
48 * array_find_index returns the index of the first element in the array
49 * that satisfies predicate p. returns -1 on failure.
51 function array_find_index (ar, p) {
52 for (var i = 0, n = ar.length; i < n; ++i) {
61 * remove_duplicates_filter returns a function that can be used in
62 * Array.filter. It removes duplicates. Optional argument cmp is a
63 * comparison function to test equality. The default comparison function
64 * tests equality of the string representation of the objects, making it
65 * unsuitable for use filtering a list of objects of compound data types.
67 function remove_duplicates_filter (cmp) {
71 if (acc.some(function (y) cmp(x, y)))
79 if (acc[x]) return false;
87 * Given an array, switches places on the subarrays at index i1 to i2 and j1 to
88 * j2. Leaves the rest of the array unchanged.
90 function switch_subarrays (arr, i1, i2, j1, j2) {
91 return arr.slice(0, i1) +
95 arr.slice(j2, arr.length);
100 * splice_ranges: Given an ordered array of non-overlapping ranges,
101 * represented as elements of [start, end], insert a new range into the
102 * array, extending, replacing, or merging existing ranges as needed.
103 * Mutates `arr' in place, but returns the reference to it.
107 * splice_range([[1,3],[4,6], 5, 8)
110 * splice_range([[1,3],[4,6],[7,10]], 2, 8)
113 function splice_range (arr, start, end) {
114 for (var i = 0; i < arr.length; ++i) {
119 arr.splice(i, 0, [start, end]);
127 * The range we are inserting overlaps the current
128 * range. We need to scan right to see if it also contains any other
129 * ranges entirely, and remove them if necessary.
132 while (j < arr.length && end >= arr[j][0])
135 arr[i][1] = Math.max(end, arr[j][1]);
136 arr.splice(i + 1, j - i);
140 if (start > arr[arr.length - 1][1])
141 arr.push([start, end]);