1 | ;
|
2 |
|
3 | /**
|
4 | * Gives same value.
|
5 | * @param v a value
|
6 | * @returns v
|
7 | */
|
8 | function id(v) {
|
9 | return v;
|
10 | }
|
11 |
|
12 | /**
|
13 | * Compares two values.
|
14 | * @param a a value
|
15 | * @param b another value
|
16 | * @returns a<b: -1, a=b: 0, a>b: 1
|
17 | */
|
18 | function cmp(a, b) {
|
19 | return a < b ? -1 : (a > b ? 1 : 0);
|
20 | }
|
21 |
|
22 | /**
|
23 | * Finds first index of a subsequence.
|
24 | * @param x an array
|
25 | * @param y subsequence?
|
26 | * @param fc compare function (a, b)
|
27 | * @param fm map function (v, i, x)
|
28 | */
|
29 | function searchSubsequence(x, y, fc = null, fm = null) {
|
30 | var fc = fc || cmp, fm = fm || id;
|
31 | var y1 = [...y].map(fm), Y = y1.length;
|
32 | var a = -1, i = -1, j = 0;
|
33 | for (var u of x) {
|
34 | var u1 = fm(u, ++i, x);
|
35 | if (fc(u1, y1[j]) !== 0)
|
36 | continue;
|
37 | if (a < 0)
|
38 | a = i;
|
39 | if (++j >= Y)
|
40 | return a;
|
41 | }
|
42 | return -1;
|
43 | }
|
44 |
|
45 | /**
|
46 | * Checks if array has a subsequence.
|
47 | * @param x an array
|
48 | * @param y subsequence?
|
49 | * @param fc compare function (a, b)
|
50 | * @param fm map function (v, i, x)
|
51 | */
|
52 | function isSubsequence(x, y, fc = null, fm = null) {
|
53 | return searchSubsequence(x, y, fc, fm) >= 0;
|
54 | }
|
55 |
|
56 | module.exports = isSubsequence;
|