Передаешь в функцию массив\немассив и информацию о том, какой именно его "кусок" надо обработать (то есть сделать с каждым элементом некое действие).
И она в цикле обрабатывает.
Собственно, для массива это очень даже просто:
function fun(arr, start, end) {
// и внутри цикл, который идет от start к end по массиву и делает действие
// а если start больше end, то то же самое, но в обратном порядке
}
Но что, если у нас не массив, а List из Immutable.js? А если Set? А если Map? А если вообще object?
Вот нужно, чтобы одна и та же функция могла с ними всеми работать, то есть как-то так:
function fun(container, range, get) {
}
где:
container - это контейнер любого типа;
range - это некий формат, в котором опять же будет задан интервал (от, до и направление);
get - это функция, которая позволяет из каждого элемента контейнера получить те значения, которые нужны для функции. Для массива нужен один get, для List нужен другой get и т.д.
А что именно должен собой представлять range?
Подумал и пришел к тому, что это должен быть iterable.
Ведь, в принципе, любой уважающий себя контейнер уже является iterable, поэтому может быть просто передан напрямую, если требуется пройти по всему контейнеру и именно в "обычном" (не обратном) порядке.
А если надо пройти лишь по какому-то интервалу контейнера, то пользователь может сделать свой iterable (например, сделав генератор), передать его и опять же все получится.
Но... делать свой iterable - это довольно сложно и громоздко.
Даже для интервала обычного массива потребуется написать строчек 5-10.
И я не нашел
ни одной библиотеки, где бы был метод вроде makeArrayIterable(array, start, end, direction), чтобы делать это в одну строку.
Отсюда закрались сомнения - а правильно ли я вообще решаю задачу, или это делается как-то проще?