vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
116 lines (115 loc) • 2.52 kB
JavaScript
import { assert } from './assert.js';
export { higherFirst };
export { lowerFirst };
export { makeFirst };
export { makeLast };
export { reverse };
/**
* ```js
* let arr = [
* { price: 10 },
* { price: 1000 },
* { price: 100 }
* ]
* arr = arr.sort(higherFirst(el => el.price))
* isEqual(arr, [
* { price: 1000 },
* { price: 100 },
* { price: 10 }
* ])
* ```
*/
function higherFirst(getValue) {
return (element1, element2) => {
const val1 = getValue(element1);
const val2 = getValue(element2);
if (val1 === val2) {
return 0;
}
return val1 > val2 ? -1 : 1;
};
}
/**
* ```js
* let arr = [
* { price: 10 },
* { price: 1000 },
* { price: 100 }
* ]
* arr = arr.sort(lowerFirst(el => el.price))
* isEqual(arr, [
* { price: 10 },
* { price: 100 },
* { price: 1000 }
* ])
* ```
*/
function lowerFirst(getValue) {
return (element1, element2) => {
const val1 = getValue(element1);
const val2 = getValue(element2);
if (val1 === val2) {
return 0;
}
return val1 < val2 ? -1 : 1;
};
}
/**
* ```js
* let arr = [
* { name: 'iphone', isRocket: false },
* { name: 'starship', isRocket: true }
* ]
* arr = arr.sort(makeFirst(el => el.isRocket))
* isEqual(arr, [
* { name: 'starship', isRocket: true },
* { name: 'iphone', isRocket: false }
* ])
* ```
*/
function makeFirst(getValue) {
return (element1, element2) => {
const val1 = getValue(element1);
const val2 = getValue(element2);
assert([true, false, null].includes(val1));
assert([true, false, null].includes(val2));
if (val1 === val2) {
return 0;
}
if (val1 === true || val2 === false) {
return -1;
}
if (val2 === true || val1 === false) {
return 1;
}
assert(false);
};
}
/**
* ```js
* let arr = [
* { name: 'starship', isRocket: true },
* { name: 'iphone', isRocket: false }
* ]
* arr = arr.sort(makeLast(el => el.isRocket))
* isEqual(arr, [
* { name: 'iphone', isRocket: false },
* { name: 'starship', isRocket: true }
* ])
* ```
*/
function makeLast(getValue) {
return makeFirst((element) => {
const val = getValue(element);
if (val === null) {
return null;
}
else {
return !val;
}
});
}
/** Reverse order result. */
function reverse(sortKey) {
return (-1 * sortKey);
}