import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/functional-basic/Classes/SearchListData - Управление Данными Поиска'/>

# Класс SearchListData

Класс `SearchListData` управляет исходным списком данных и связанным с ним кэшем поиска. Он отвечает за форматирование элементов, извлечение значений из вложенных путей и применение тегов выделения к совпадающим строкам.

## Ключевые особенности

- **Отложенная инициализация (Lazy)** — реализует генерацию кэша по требованию, гарантируя, что затраты производительности происходят только при активном выполнении поиска.
- **Кэширование поиска** — генерирует плоское строковое представление указанных столбцов для каждого элемента для быстрого поиска.
- **Поддержка вложенных путей** — возможность извлекать данные из глубоких структур объектов (например, `'user.profile.name'`).
- **Автоматическое выделение** — оборачивает совпадающие части строки в HTML-теги для визуальной обратной связи.
- **Форматирование CamelCase** — преобразует пути столбцов в удобные имена свойств (например, `'user.name'` превращается в `'userNameSearch'`).

## Инициализация

Для инициализации объекта вызовите конструктор `SearchListData(list, columns, item, options)`.

**Параметры:**
- `list: T[]` — исходный массив элементов данных.
- `columns?: string[]` — массив путей к свойствам для поиска.
- `item: SearchListItem` — состояние элемента поиска.
- `options: SearchListOptions` — параметры конфигурации.

```typescript
import { SearchListData, SearchListItem, SearchListOptions } from '@dxtmisha/functional-basic'

const options = new SearchListOptions()
const item = new SearchListItem('alice', options)
const data = new SearchListData(
  [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }],
  ['name'],
  item,
  options
)

const results = data.forEach((origItem, value) => {
  return data.toFormatItem(origItem, true)
})
```

## Методы

### Информационные

- `is(): boolean` — Проверяет, инициализированы ли и список, и столбцы.
- `isList(): boolean` — Проверяет, предоставлен ли исходный список.
- `getList(): T[]` — Возвращает исходный список данных.
- `getColumns(): string[] | undefined` — Возвращает текущие столбцы поиска.
- `findCacheItem(item: T)` — Находит кэшированное значение поиска для конкретного исходного элемента.

### Настройка (Сеттеры)

- `setList(list: T[]): this` — Обновляет список данных и регенерирует кэш.
- `setColumns(columns?: string[]): this` — Обновляет столбцы поиска и регенерирует кэш.

### Обработка

- `toFormatItem(item: T, selection: boolean): object` — Преобразует исходный элемент в отформатированный с тегами выделения.
- `forEach(callback: Function): Array` — Перебирает кэш и возвращает список элементов, отформатированных через callback.

## Формирование кэша

Система поиска использует стратегию отложенной инициализации (lazy initialization) для оптимизации производительности при работе с большими списками:
- **Генерация по требованию**: Кэш не создается при создании экземпляра класса. Вместо этого он формируется только в тот момент, когда операция поиска запрашивает его в первый раз.
- **Инвалидация кэша**: Вызов `setList()` или `setColumns()` автоматически сбрасывает существующий кэш. Он будет незаметно перестроен при следующем поиске.
- **Плоское представление**: Для создания кэша класс проходит по исходному списку и извлекает значения из указанных `columns` (включая глубокие пути). Эти значения преобразуются в строки и объединяются в одну длинную строку, разделенную пробелами. Эта объединенная строка сохраняется в `SearchCacheItem.value` и используется во всех последующих высокоскоростных проверках регулярными выражениями. Такой подход полностью исключает сложный обход объектов во время активного набора текста пользователем.

## Типы

### SearchCacheItem

Объект, представляющий отдельный элемент в кэше поиска:

- `item: T` — ссылка на исходный элемент данных.
- `value: string` — плоское строковое представление доступных для поиска столбцов.

### SearchCache

Коллекция объектов `SearchCacheItem`, используемая для эффективного поиска:
`type SearchCache<T> = SearchCacheItem<T>[]`
