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

<Meta title='@dxtmisha/ru/functional-basic/Classes/HashInstance - Экземпляр URL Hash'/>

# Класс HashInstance

`HashInstance` — это основной класс, реализующий логику управления данными в URL-хэше. Он обеспечивает хранение состояния, механизмы подписки на изменения и синхронизацию с браузерным API.

Вы можете использовать этот класс напрямую, если вам требуется изолированное управление хэшем, отличное от глобального состояния `Hash`.

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

- **Изолированное состояние** — Хранит свой набор переменных хэша.
- **Поддержка цепочки вызовов** — Большинство методов возвращают `this`, позволяя писать компактный код.
- **Автоматическая синхронизация** — При инициализации считывает данные из URL и подписывается на событие `hashchange`.
- **SSR-совместимость** — Безопасно работает в серверном окружении, используя заглушки для DOM API.

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

Для создания экземпляра используйте конструктор `HashInstance()`.

```typescript
import { HashInstance } from '@dxtmisha/functional-basic'

const myHash = new HashInstance()
```

## Методы

### Чтение и запись
- `get<T>(name: string, defaultValue?: T | (() => T)): T` — Возвращает значение переменной. Если её нет, устанавливает `defaultValue` и возвращает его.
- `set<T>(name: string, callback: T | (() => T)): this` — Обновляет значение переменной и синхронизирует URL.

### Наблюдение (Watchers)
- `addWatch<T>(name: string, callback: (value: T) => void): this` — Добавляет обработчик изменения переменной.
- `removeWatch<T>(name: string, callback: (value: T) => void): this` — Удаляет обработчик.

### Управление
- `reload(): this` — Обновляет внутреннее состояние из текущего URL-хэша.

## Примеры

### Использование изолированного экземпляра
```typescript
const searchHash = new HashInstance()

// Подписка
searchHash.addWatch('query', (q) => {
  console.log('Поиск:', q)
})

// Установка значения (обновит URL)
searchHash.set('query', 'smartphones')
```
