import { curry } from '@typed/lambda'
import { equals } from '@typed/logic'
const isZero = equals(0)
/**
* Remove values from a list at a given index.
* @param index :: int
* @param amount :: int
* @param list :: [a]
* @returns :: [a]
*/
export const remove = curry(function remove(
index: number,
amount: number,
list: ReadonlyArray,
): A[] {
const length = list.length
if (isZero(amount) || isZero(length) || index >= length) {
return list.slice()
}
if (isZero(index) && amount >= length) {
return []
}
const newList = Array(length - Math.abs(index) - 1)
for (let i = 0; i < index; ++i) {
newList[i] = list[i]
}
for (let i = index + amount; i < length; ++i) {
newList[i - amount] = list[i]
}
return newList
}) as {
(index: number, amount: number, list: ReadonlyArray): A[]
(index: number, amount: number): (list: ReadonlyArray) => A[]
(index: number): {
(amount: number, list: ReadonlyArray): A[]
(amount: number): (list: ReadonlyArray) => A[]
}
}