mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.2 KiB
42 lines
1.2 KiB
import { isArray } from './_internals/isArray.js';
|
|
import { curry } from './curry.js';
|
|
|
|
function swapArrayOrString(indexA, indexB, iterable) {
|
|
const actualIndexA = indexA < 0 ? iterable.length + indexA : indexA;
|
|
const actualIndexB = indexB < 0 ? iterable.length + indexB : indexB;
|
|
if (
|
|
actualIndexA === actualIndexB ||
|
|
Math.min(actualIndexA, actualIndexB) < 0 ||
|
|
Math.max(actualIndexA, actualIndexB) >= iterable.length
|
|
)
|
|
return iterable;
|
|
if (typeof iterable === 'string') {
|
|
return (
|
|
iterable.slice(0, actualIndexA) +
|
|
iterable[actualIndexB] +
|
|
iterable.slice(actualIndexA + 1, actualIndexB) +
|
|
iterable[actualIndexA] +
|
|
iterable.slice(actualIndexB + 1)
|
|
);
|
|
}
|
|
const clone = iterable.slice();
|
|
const temp = clone[actualIndexA];
|
|
clone[actualIndexA] = clone[actualIndexB];
|
|
clone[actualIndexB] = temp;
|
|
return clone;
|
|
}
|
|
function swapFn(indexA, indexB, iterable) {
|
|
if (isArray(iterable) || typeof iterable === 'string')
|
|
return swapArrayOrString(indexA, indexB, iterable);
|
|
|
|
const aVal = iterable[indexA];
|
|
const bVal = iterable[indexB];
|
|
if (aVal === undefined || bVal === undefined) return iterable;
|
|
return {
|
|
...iterable,
|
|
[indexA]: iterable[indexB],
|
|
[indexB]: iterable[indexA],
|
|
};
|
|
}
|
|
|
|
export const swap = curry(swapFn);
|
|
|