npm install ds-kit-js
Пакет не имеет зависимостей, работает в Node.js 20+ и современных браузерах, поставляется в форматах ESM и CommonJS со встроенными типами TypeScript.
// ESM / TypeScript
import { Queue, RedBlackTree, Graph } from 'ds-kit-js';
// CommonJS
const { Queue, RedBlackTree, Graph } = require('ds-kit-js');
Пакет помечен как sideEffects: false, поэтому бандлеры (Vite, webpack, esbuild)
удаляют неиспользуемые структуры из итоговой сборки.
Почти все коллекции устроены одинаково, поэтому, освоив одну, легко пользоваться остальными:
| Член | Назначение |
|---|---|
new X(iterable?) |
создать коллекцию, сразу заполнив её из массива, Set, генератора и т. п. |
size |
количество элементов (геттер, как у Map/Set) |
isEmpty() |
true, если коллекция пуста |
clear() |
удалить все элементы |
toArray() |
элементы массивом |
for...of, [...x] |
итерация (порядок описан в документации каждой структуры) |
Методы-«модификаторы» вроде push, enqueue, addEdge возвращают this,
поэтому вызовы можно объединять в цепочки:
const queue = new Queue<number>().enqueue(1).enqueue(2).enqueue(3);
Методы, которые извлекают элемент из пустой коллекции (pop, dequeue, peek…),
возвращают undefined, а не бросают исключение. Исключение RangeError бросается
только при явно некорректных аргументах: отрицательной ёмкости, индексе вне диапазона и т. п.
Все структуры обобщённые (generic). Тип элементов выводится из начальных данных или задаётся явно:
const numbers = new Stack([1, 2, 3]); // Stack<number>
const users = new Queue<User>(); // Queue<User>
Упорядоченные структуры (BinarySearchTree, AVLTree, RedBlackTree, SkipList,
SortedMap, BinaryHeap) по умолчанию сравнивают элементы операторами < и >.
Это подходит для чисел, строк, bigint и Date. Для объектов передайте компаратор —
функцию с тем же контрактом, что у Array.prototype.sort:
import { AVLTree, reverseCompare } from 'ds-kit-js';
interface User { id: number; name: string }
const byId = new AVLTree<User>([], (a, b) => a.id - b.id);
byId.insert({ id: 2, name: 'Борис' });
byId.insert({ id: 1, name: 'Анна' });
// get() ищет по компаратору и возвращает хранимый объект целиком
byId.get({ id: 2 } as User)?.name; // 'Борис'
// Обратный порядок
const desc = new AVLTree<number>([], reverseCompare());
Элементы, равные по компаратору, считаются дубликатами: множества (*Tree, SkipList)
хранят только первый из них, а SortedMap перезаписывает значение.
⚠️ Не изменяйте у объекта поля, по которым он сравнивается, пока он лежит в дереве или куче: это нарушит порядок. Удалите объект, измените его и вставьте заново.