Как сделать функцию, способную обрабатывать заданный «кусок» массива или любого другого контейнера?
=====================================================================================================

 Передаешь в функцию массив\немассив и информацию о том, какой именно его "кусок" надо обработать (то есть сделать с каждым элементом некое действие).  

И она в цикле обрабатывает.  

  

Собственно, для массива это очень даже просто:  

```
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), чтобы делать это в одну строку.  

Отсюда закрались сомнения - а правильно ли я вообще решаю задачу, или это делается как-то проще? 

> а правильно ли я вообще решаю задачу

Конечно же, нет.  

Эта задача решается плагинами-обёртками-адаптерами, которые на вход получают данные в каком-то **одном** формате, преобразуют его в другой, внутренний формат вашей библиотеки, который тоже **один** и дальше она работает только с ним, а потом отдаёт результат адаптеру для переконвертации.  

  

Контракт адаптера жёстко зафиксирован и довольно мал, поэтому любителям странного легко сделать свой под свой уникальный формат. А для небольшого количества возможных адекватных форматов вы можете написать плагины сразу.  

  

Вы не нашли **ни одной** библиотеки по двум причинам:  

1. Описанное вами поведение абсолютно некорректно с точки зрения некоторых указанных структур данных и стандарта языка. У объектов, сетов, мапов и т.д. нет никакого range. То, что это *можно* закостылить не означает, что это *стоит* делать.  

2. В реальном мире, а не в розовых фантазиях оверинжиниринга и перепридумывания всего и вся, потому что все, кто были в индустрии до вас, дураки, таких задач просто не стоит, потому что см. пункт 1.