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

<Meta title='@dxtmisha/ru/functional-basic/Classes/Cache - Базовое кэширование'/>

# Класс Cache

> **⚠️ Устарел** — Этот класс устарел и не рекомендуется к использованию.

Легковесный механизм кэширования в памяти. Он предоставляет эффективный способ выполнения ресурсоемких функций получения данных только при необходимости, полагаясь на «массивы сравнения» для запуска инвалидации и пересчета кэша.

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

- **Выполнение по требованию** — функции запускаются только тогда, когда кэшированное значение отсутствует или инвалидировано.
- **Инвалидация по массиву сравнения** — автоматически пересчитывает кэш, если предоставленный массив зависимостей изменяется (подобно массивам зависимостей `useMemo` или `useEffect` в React).
- **Асинхронная поддержка** — безупречно работает с получением данных на основе `Promise`.

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

Для инициализации объекта вызовите конструктор `Cache()`.

```typescript
import { Cache } from '@dxtmisha/functional'

// 1. Инициализация хранилища
const cache = new Cache()

// 2. Получение или вычисление значения
const user = cache.get('user', () => 'Admin', [1])
```

## Методы

### Действие

#### `get`

Используйте метод `get()` для получения кэшированного значения или его вычисления, если оно не существует или устарело.

**Параметры:**
- `name: string` — уникальный идентификатор записи кэша.
- `callback: () => T` — функция, которая вычисляет значение.
- `comparison?: any[]` — опциональный массив зависимостей. Если любое значение в этом массиве изменится с прошлого вызова, кэш очищается и `callback` запускается снова.

**Возвращает:** `T` — кэшированное или вычисленное значение.

```javascript
let counter = 0

// Вычислит и закэширует "Пользователь 1"
const user1 = cache.get('user', () => `Пользователь ${++counter}`, [1])

// НЕ будет вычислять, вернет закэшированное "Пользователь 1"
const unchanged = cache.get('user', () => `Пользователь ${++counter}`, [1])

// Массив зависимостей изменился с [1] на [2]
// Вычислит и закэширует "Пользователь 2"
const changed = cache.get('user', () => `Пользователь ${++counter}`, [2])
```

#### `getAsync`

Работает идентично `get()`, но предназначен для асинхронных вызовов.

**Параметры:**
- `name: string` — уникальный идентификатор.
- `callback: () => Promise<T>` — асинхронная функция, генерирующая результат.
- `comparison?: any[]` — опциональный массив зависимостей.

**Возвращает:** `Promise<T>` — асинхронное кэшированное значение.

```javascript
async function fetchUser(id) {
  return cache.getAsync('user_api', async () => {
    const res = await fetch(`/api/users/${id}`)
    return res.json()
  }, [id])
}

// Первый вызов идет в сеть
const u1 = await fetchUser(5)

// Второй вызов возвращает кэш мгновенно (без обращения к сети)
const u1Cached = await fetchUser(5)

// Зависимость `id` изменилась (5 !== 6), снова идет в сеть
const u2 = await fetchUser(6)
```
