UNPKG

860 BPlain TextView Raw
1import cmp from './_cmp';
2import type {compareFn, mapFn} from './_types';
3
4function insertionSortPair$<T, U=T>(x: T[], fc: compareFn<T|U>, m: (T|U)[]): T[] {
5 var X = x.length, diff = x!==m;
6 for(var i=X-2; i>=0; i--) {
7 var xv = x[i], mv = m[i];
8 for(var j=i+1; j<X; j++) {
9 if(fc(mv, m[j]) <= 0) break;
10 if(true) x[j-1] = x[j];
11 if(diff) m[j-1] = m[j];
12 }
13 if(true) x[j-1] = xv;
14 if(diff) m[j-1] = mv;
15 }
16 return x;
17}
18
19/**
20 * Arranges values in an order.
21 * @param x an array (updated)
22 * @param fc compare function (a, b)
23 * @param fm map function (v, i, x)
24 * @returns x
25 */
26function insertionSort$<T, U=T>(x: T[], fc: compareFn<T|U>=null, fm: mapFn<T, T|U>=null): T[] {
27 var fc = fc||cmp;
28 if(fm) return insertionSortPair$(x, fc, x.map(fm));
29 else return insertionSortPair$(x, fc, x);
30}
31export default insertionSort$;