@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.
@@ -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
+ ;
@@ -8,7 +8,7 @@
8
8
  * @todo Finish doc
9
9
  * @example
10
10
  * ```javascript
11
- * bbbn.fn.move([
11
+ * bbn.fn.move([
12
12
  * {movie: "Brazil", year: 1985},
13
13
  * {movie: "Donnie Darko", year: 2001},
14
14
  * {movie: "Out of Africa", year: 1985}
@@ -8,7 +8,7 @@
8
8
  * @todo Finish doc
9
9
  * @example
10
10
  * ```javascript
11
- * bbbn.fn.move([
11
+ * bbn.fn.move([
12
12
  * {movie: "Brazil", year: 1985},
13
13
  * {movie: "Donnie Darko", year: 2001},
14
14
  * {movie: "Out of Africa", year: 1985}
@@ -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
- throw new Error(bbn._('The second argument for a search cannot be null or undefined'));
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bbn/bbn",
3
- "version": "1.0.387",
3
+ "version": "1.0.389",
4
4
  "description": "Javascript toolkit",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",