@bbn/bbn 1.0.387 → 1.0.389
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bbn.js +1 -1
- package/dist/bbn.js.map +1 -1
- package/dist/fn/object/getSortingMoves.d.ts +1 -0
- package/dist/fn/object/getSortingMoves.js +98 -0
- package/dist/fn/object/move.d.ts +1 -1
- package/dist/fn/object/move.js +1 -1
- package/dist/fn/object/search.js +14 -2
- package/dist/fn.d.ts +2 -0
- package/dist/fn.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function getSortingMoves(src: Array<any>, dst: Array<any>): Array<any>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal "move i -> j" plan to transform src into dst.
|
|
3
|
+
* One allowed op: arr.splice(to, 0, arr.splice(from, 1)[0])
|
|
4
|
+
* Assumes: same length, same set of UNIQUE primitive values.
|
|
5
|
+
*
|
|
6
|
+
* @method getSortingMoves
|
|
7
|
+
* @global
|
|
8
|
+
* @example
|
|
9
|
+
* ```javascript
|
|
10
|
+
* const a = ['a','b','c','d','e'];
|
|
11
|
+
* const b = ['b','a','e','c','d'];
|
|
12
|
+
* const plan = bbn.fn.getSortingMoves(a, b);
|
|
13
|
+
* console.log(plan);
|
|
14
|
+
* // [{from:0, to:1, value: "a"}, {from:4, to:2, value: "e"}]
|
|
15
|
+
* ```
|
|
16
|
+
* @memberof bbn.fn
|
|
17
|
+
* @param {Array} src The array
|
|
18
|
+
* @param {Array} dst The index of the element to move
|
|
19
|
+
* @returns {Array} The same array, with elements repositionned.
|
|
20
|
+
*/
|
|
21
|
+
// LIS indices on `pos` (strictly increasing)
|
|
22
|
+
var lisIndices = function (arr) {
|
|
23
|
+
var n = arr.length, tails = [], prev = Array(n).fill(-1);
|
|
24
|
+
for (var i = 0; i < n; i++) {
|
|
25
|
+
var x = arr[i], lo = 0, hi = tails.length;
|
|
26
|
+
while (lo < hi) {
|
|
27
|
+
var mid = (lo + hi) >> 1;
|
|
28
|
+
if (arr[tails[mid]] < x)
|
|
29
|
+
lo = mid + 1;
|
|
30
|
+
else
|
|
31
|
+
hi = mid;
|
|
32
|
+
}
|
|
33
|
+
if (lo > 0)
|
|
34
|
+
prev[i] = tails[lo - 1];
|
|
35
|
+
tails[lo] = i;
|
|
36
|
+
}
|
|
37
|
+
var res = [];
|
|
38
|
+
for (var k = tails.length ? tails[tails.length - 1] : -1; k !== -1; k = prev[k])
|
|
39
|
+
res.push(k);
|
|
40
|
+
return res.reverse();
|
|
41
|
+
};
|
|
42
|
+
export default function getSortingMoves(src, dst) {
|
|
43
|
+
if (src.length !== dst.length)
|
|
44
|
+
throw new Error("Lengths must match.");
|
|
45
|
+
// Validate same unique set
|
|
46
|
+
var setDst = new Set(dst);
|
|
47
|
+
if (setDst.size !== dst.length)
|
|
48
|
+
throw new Error("dst has duplicates.");
|
|
49
|
+
var setSrc = new Set(src);
|
|
50
|
+
if (setSrc.size !== src.length)
|
|
51
|
+
throw new Error("src has duplicates.");
|
|
52
|
+
if (src.length !== setDst.size || Array.from(setSrc).some(function (v) { return !setDst.has(v); })) {
|
|
53
|
+
throw new Error("Arrays must contain the same unique values.");
|
|
54
|
+
}
|
|
55
|
+
// Map each value to its index in dst
|
|
56
|
+
var posInDst = new Map(dst.map(function (v, i) { return [v, i]; }));
|
|
57
|
+
// Convert src into positions-in-dst
|
|
58
|
+
var pos = src.map(function (v) { return posInDst.get(v); });
|
|
59
|
+
var lisIdx = lisIndices(pos);
|
|
60
|
+
var keepSet = new Set(lisIdx.map(function (i) { return src[i]; })); // values we won't move
|
|
61
|
+
// Next kept anchor to the right for each dst index
|
|
62
|
+
var nextKeptAfter = Array(dst.length).fill(-1);
|
|
63
|
+
for (var i = dst.length - 2; i >= 0; i--) {
|
|
64
|
+
nextKeptAfter[i] = nextKeptAfter[i + 1];
|
|
65
|
+
if (keepSet.has(dst[i + 1]))
|
|
66
|
+
nextKeptAfter[i] = i + 1;
|
|
67
|
+
}
|
|
68
|
+
// Simulate moves on a working copy
|
|
69
|
+
var work = src.slice();
|
|
70
|
+
var indexOf = new Map(work.map(function (v, i) { return [v, i]; }));
|
|
71
|
+
var moves = [];
|
|
72
|
+
for (var i = 0; i < dst.length; i++) {
|
|
73
|
+
var v = dst[i];
|
|
74
|
+
if (keepSet.has(v))
|
|
75
|
+
continue; // leave in place
|
|
76
|
+
var from = indexOf.get(v);
|
|
77
|
+
if (from === undefined) {
|
|
78
|
+
throw new Error("Inconsistent state");
|
|
79
|
+
}
|
|
80
|
+
var j = nextKeptAfter[i];
|
|
81
|
+
var to = (j !== -1) ? indexOf.get(dst[j]) : work.length;
|
|
82
|
+
if (to === undefined) {
|
|
83
|
+
throw new Error("Inconsistent state");
|
|
84
|
+
}
|
|
85
|
+
var adjustedTo = from < to ? to - 1 : to;
|
|
86
|
+
if (from !== adjustedTo) {
|
|
87
|
+
var moved = work.splice(from, 1)[0];
|
|
88
|
+
work.splice(adjustedTo, 0, moved);
|
|
89
|
+
moves.push({ from: from, to: adjustedTo, value: v });
|
|
90
|
+
// refresh indices (simple & reliable)
|
|
91
|
+
indexOf.clear();
|
|
92
|
+
for (var p = 0; p < work.length; p++)
|
|
93
|
+
indexOf.set(work[p], p);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return moves;
|
|
97
|
+
}
|
|
98
|
+
;
|
package/dist/fn/object/move.d.ts
CHANGED
package/dist/fn/object/move.js
CHANGED
package/dist/fn/object/search.js
CHANGED
|
@@ -115,9 +115,21 @@ export default function search(arr, prop, val, operator, startFrom, backward) {
|
|
|
115
115
|
var filter;
|
|
116
116
|
var isFn = false;
|
|
117
117
|
if (!prop) {
|
|
118
|
-
|
|
118
|
+
isFn = true;
|
|
119
|
+
filter = function (a) {
|
|
120
|
+
return compareConditions({ value: a }, filterToConditions({
|
|
121
|
+
logic: 'AND',
|
|
122
|
+
conditions: [
|
|
123
|
+
{
|
|
124
|
+
field: 'value',
|
|
125
|
+
operator: operator || '=',
|
|
126
|
+
value: val,
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
}));
|
|
130
|
+
};
|
|
119
131
|
}
|
|
120
|
-
if (typeof prop === 'string') {
|
|
132
|
+
else if (typeof prop === 'string') {
|
|
121
133
|
filter = {
|
|
122
134
|
conditions: [
|
|
123
135
|
{
|
package/dist/fn.d.ts
CHANGED
|
@@ -111,6 +111,7 @@ import getProperty from './fn/object/getProperty.js';
|
|
|
111
111
|
import getRequestId from './fn/ajax/getRequestId.js';
|
|
112
112
|
import getRow from './fn/object/getRow.js';
|
|
113
113
|
import getScrollBarSize from './fn/style/getScrollBarSize.js';
|
|
114
|
+
import getSortingMoves from './fn/object/getSortingMoves.js';
|
|
114
115
|
import getText from './fn/html/getText.js';
|
|
115
116
|
import getTimeoff from './fn/misc/getTimeoff.js';
|
|
116
117
|
import happy from './fn/browser/happy.js';
|
|
@@ -354,6 +355,7 @@ declare const _default: {
|
|
|
354
355
|
getRequestId: typeof getRequestId;
|
|
355
356
|
getRow: typeof getRow;
|
|
356
357
|
getScrollBarSize: typeof getScrollBarSize;
|
|
358
|
+
getSortingMoves: typeof getSortingMoves;
|
|
357
359
|
getText: typeof getText;
|
|
358
360
|
getTimeoff: typeof getTimeoff;
|
|
359
361
|
happy: typeof happy;
|
package/dist/fn.js
CHANGED
|
@@ -111,6 +111,7 @@ import getProperty from './fn/object/getProperty.js';
|
|
|
111
111
|
import getRequestId from './fn/ajax/getRequestId.js';
|
|
112
112
|
import getRow from './fn/object/getRow.js';
|
|
113
113
|
import getScrollBarSize from './fn/style/getScrollBarSize.js';
|
|
114
|
+
import getSortingMoves from './fn/object/getSortingMoves.js';
|
|
114
115
|
import getText from './fn/html/getText.js';
|
|
115
116
|
import getTimeoff from './fn/misc/getTimeoff.js';
|
|
116
117
|
import happy from './fn/browser/happy.js';
|
|
@@ -354,6 +355,7 @@ export default {
|
|
|
354
355
|
getRequestId: getRequestId,
|
|
355
356
|
getRow: getRow,
|
|
356
357
|
getScrollBarSize: getScrollBarSize,
|
|
358
|
+
getSortingMoves: getSortingMoves,
|
|
357
359
|
getText: getText,
|
|
358
360
|
getTimeoff: getTimeoff,
|
|
359
361
|
happy: happy,
|