UNPKG

@extra-array/is-permutation

Version:

Checks if array has a permutation.

70 lines (63 loc) 1.5 kB
'use strict'; /** * Gives same value. * @param v a value * @returns v */ function id(v) { return v; } /** * Compares two values. * @param a a value * @param b another value * @returns a<b: -1, a=b: 0, a>b: 1 */ function cmp(a, b) { return a < b ? -1 : (a > b ? 1 : 0); } /** * Finds first index of a subsequence. * @param x an array * @param y subsequence? * @param fc compare function (a, b) * @param fm map function (v, i, x) */ function searchSubsequence(x, y, fc = null, fm = null) { var fc = fc || cmp, fm = fm || id; var y1 = [...y].map(fm), Y = y1.length; var a = -1, i = -1, j = 0; for (var u of x) { var u1 = fm(u, ++i, x); if (fc(u1, y1[j]) !== 0) continue; if (a < 0) a = i; if (++j >= Y) return a; } return -1; } /** * Checks if array has a subsequence. * @param x an array * @param y subsequence? * @param fc compare function (a, b) * @param fm map function (v, i, x) */ function isSubsequence(x, y, fc = null, fm = null) { return searchSubsequence(x, y, fc, fm) >= 0; } /** * Checks if array has a permutation. * @param x an array * @param y permutation? * @param fc map function (v, i, x) * @param fm compare function (a, b) */ function isPermutation(x, y, fc = null, fm = null) { var x1 = fm ? x.map(fm) : x.slice(); var y1 = fm ? y.map(fm) : y.slice(); return isSubsequence(x1.sort(), y1.sort(), fc, fm); } module.exports = isPermutation;