UNPKG

1.02 kBJavaScriptView Raw
1'use strict';
2
3/**
4 * Compares two values.
5 * @param a a value
6 * @param b another value
7 * @returns a<b: -1, a=b: 0, a>b: 1
8 */
9function cmp(a, b) {
10 return a < b ? -1 : (a > b ? 1 : 0);
11}
12
13function insertionSortPair$(x, fc, m) {
14 var X = x.length, diff = x !== m;
15 for (var i = X - 2; i >= 0; i--) {
16 var xv = x[i], mv = m[i];
17 for (var j = i + 1; j < X; j++) {
18 if (fc(mv, m[j]) <= 0)
19 break;
20 x[j - 1] = x[j];
21 if (diff)
22 m[j - 1] = m[j];
23 }
24 x[j - 1] = xv;
25 if (diff)
26 m[j - 1] = mv;
27 }
28 return x;
29}
30/**
31 * Arranges values in an order.
32 * @param x an array (updated)
33 * @param fc compare function (a, b)
34 * @param fm map function (v, i, x)
35 * @returns x
36 */
37function insertionSort$(x, fc = null, fm = null) {
38 var fc = fc || cmp;
39 if (fm)
40 return insertionSortPair$(x, fc, x.map(fm));
41 else
42 return insertionSortPair$(x, fc, x);
43}
44
45module.exports = insertionSort$;