@mirta/basics 0.3.5 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Преобразует входное значение в массив.
3
+ *
4
+ * Если входное значение уже является массивом, возвращает его копию.
5
+ * В противном случае оборачивает значение в массив и возвращает результат.
6
+ *
7
+ * @template TItem - Тип элемента или массива элементов.
8
+ * @param input - Входное значение, которое может быть одиночным элементом или массивом элементов.
9
+ * @returns Массив, содержащий один элемент (если входной — не массив) или копию входного массива.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * ensureArray('hello') // → ['hello']
14
+ * ```
15
+ * @example
16
+ * ```ts
17
+ * ensureArray([1, 2, 3]) // → [1, 2, 3]
18
+ * ```
19
+ * @example
20
+ * ```ts
21
+ * ensureArray(null) // → [null]
22
+ * ```
23
+ * @since 0.4.0
24
+ *
25
+ **/
26
+ declare function ensureArray<TItem>(input: TItem | TItem[]): TItem[];
27
+
28
+ /**
29
+ * Преобразует входные данные в массив, исключая все "ложные" значения.
30
+ *
31
+ * К ложным значениям относятся: `0`, `''`, `false`, `null`, `undefined`, `NaN`.
32
+ *
33
+ * @template TItem - Тип допустимых значений.
34
+ * @param input - Вход: значение или массив с возможными `false`, `null`, `undefined`.
35
+ * @returns Массив истинных значений типа `TItem[]`. Если вход пустой — возвращает `[]`.
36
+ *
37
+ * @example
38
+ *
39
+ * ```ts
40
+ * ensureCompactArray([1, null, 2, '']) // → [1, 2]
41
+ *
42
+ * ```
43
+ * @example
44
+ *
45
+ * ```ts
46
+ * ensureCompactArray('hello') // → ['hello']
47
+ *
48
+ * ```
49
+ * @example
50
+ *
51
+ * ```ts
52
+ * ensureCompactArray(undefined) // → []
53
+ *
54
+ * ```
55
+ *
56
+ * @since 0.4.0
57
+ *
58
+ **/
59
+ declare function ensureCompactArray<TItem>(input: TItem | false | null | undefined | (TItem | false | null | undefined)[]): TItem[];
60
+
61
+ export { ensureArray, ensureCompactArray };
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Преобразует входное значение в массив.
3
+ *
4
+ * Если входное значение уже является массивом, возвращает его копию.
5
+ * В противном случае оборачивает значение в массив и возвращает результат.
6
+ *
7
+ * @template TItem - Тип элемента или массива элементов.
8
+ * @param input - Входное значение, которое может быть одиночным элементом или массивом элементов.
9
+ * @returns Массив, содержащий один элемент (если входной — не массив) или копию входного массива.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * ensureArray('hello') // → ['hello']
14
+ * ```
15
+ * @example
16
+ * ```ts
17
+ * ensureArray([1, 2, 3]) // → [1, 2, 3]
18
+ * ```
19
+ * @example
20
+ * ```ts
21
+ * ensureArray(null) // → [null]
22
+ * ```
23
+ * @since 0.4.0
24
+ *
25
+ **/
26
+ function ensureArray(input) {
27
+ return Array.isArray(input) ? [...input] : [input];
28
+ }
29
+
30
+ /**
31
+ * Преобразует входные данные в массив, исключая все "ложные" значения.
32
+ *
33
+ * К ложным значениям относятся: `0`, `''`, `false`, `null`, `undefined`, `NaN`.
34
+ *
35
+ * @template TItem - Тип допустимых значений.
36
+ * @param input - Вход: значение или массив с возможными `false`, `null`, `undefined`.
37
+ * @returns Массив истинных значений типа `TItem[]`. Если вход пустой — возвращает `[]`.
38
+ *
39
+ * @example
40
+ *
41
+ * ```ts
42
+ * ensureCompactArray([1, null, 2, '']) // → [1, 2]
43
+ *
44
+ * ```
45
+ * @example
46
+ *
47
+ * ```ts
48
+ * ensureCompactArray('hello') // → ['hello']
49
+ *
50
+ * ```
51
+ * @example
52
+ *
53
+ * ```ts
54
+ * ensureCompactArray(undefined) // → []
55
+ *
56
+ * ```
57
+ *
58
+ * @since 0.4.0
59
+ *
60
+ **/
61
+ function ensureCompactArray(input) {
62
+ if (Array.isArray(input))
63
+ return input.filter(Boolean);
64
+ return input ? [input] : [];
65
+ }
66
+
67
+ export { ensureArray, ensureCompactArray };
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Универсальный результат вычисления расстояния редактирования между двумя строками.
3
+ *
4
+ * Интерфейс предназначен для стандартизации выходных данных различных алгоритмов
5
+ * нечёткого сравнения строк, таких как Левенштейн и Дамерау-Левенштейн.
6
+ *
7
+ * Позволяет единообразно работать с метриками схожести в системах подсказок,
8
+ * нечёткого поиска и обработки опечаток.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const result: DistanceResult = damerauLevenshtein("команда", "команда");
13
+ * log(result.steps); // 0
14
+ * log(result.relative); // 0
15
+ * log(result.similarity); // 1
16
+ * ```
17
+ * @since 0.4.0
18
+ *
19
+ **/
20
+ interface DistanceResult {
21
+ /**
22
+ * Количество операций редактирования, необходимых для преобразования
23
+ * одной строки в другую. Конкретный набор операций зависит от реализации алгоритма:
24
+ *
25
+ * - Алгоритм Левенштейна: вставка, удаление, замена
26
+ * - Алгоритм Дамерау-Левенштейна: + транспозиция соседних символов
27
+ * - Другие алгоритмы: могут использовать свои метрики (например, блоковые перестановки)
28
+ *
29
+ * @example
30
+ * Для алгоритма Дамерау-Левенштейна:
31
+ * ```txt
32
+ * "релиз" → "релзи" = 1 (транспозиция 'и' и 'з')
33
+ * ```
34
+ * Для алгоритма Левенштейна:
35
+ * ```txt
36
+ * "релиз" → "релзи" = 2 (удаление + вставка)
37
+ * ```
38
+ **/
39
+ readonly steps: number;
40
+ /**
41
+ * Относительное расстояние — нормализованная метрика, рассчитываемая как отношение
42
+ * количества операций к максимальной длине сравниваемых строк.
43
+ *
44
+ * Позволяет сравнивать строки разной длины на одной шкале.
45
+ *
46
+ * Указывается в диапазоне от 0 (полное совпадение) до 1 (максимальное различие).
47
+ *
48
+ * @example
49
+ * Для строк "текст" (5) и "тест" (4) при steps = 1:
50
+ * ```txt
51
+ * relative = 1 / max(5, 4) = 1 / 5 = 0.2
52
+ * ```
53
+ **/
54
+ readonly relative: number;
55
+ /**
56
+ * Степень схожести строк — величина, обратная относительному расстоянию.
57
+ *
58
+ * Используется для ранжирования результатов в системах нечёткого поиска и подсказок.
59
+ * Чем выше значение, тем больше вероятность, что строки семантически близки.
60
+ *
61
+ * Указывается в диапазоне от 0 (максимальное различие) до 1 (полное совпадение)
62
+ *
63
+ * @example
64
+ * ```txt
65
+ * similarity = 1 - relative
66
+ * relative = 0.2 → similarity = 0.8
67
+ * ```
68
+ **/
69
+ readonly similarity: number;
70
+ }
71
+
72
+ /**
73
+ * Вычисляет расстояние Дамерау-Левенштейна между двумя строками.
74
+ *
75
+ * Сложность: `O(n × m)` 💥 Экспоненциальный рост.
76
+ *
77
+ * @param from Первая строка
78
+ * @param to Вторая строка
79
+ * @param maxDistance Максимальное расстояние для расчёта.
80
+ * Если превышено, расстояние возвращается как `Infinity`.
81
+ *
82
+ * @since 0.4.0
83
+ *
84
+ **/
85
+ declare function damerauLevenshtein(from: string, to: string, maxDistance?: number): DistanceResult;
86
+
87
+ /**
88
+ * Тип для фонетического кода — строка, гарантированно содержащая 6 цифр.
89
+ *
90
+ * Используется для маркировки результата функции `daitchMokotoffLite`,
91
+ * чтобы отличать обычные строки от валидных фонетических кодов.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * '550000' as PhoneticCode
96
+ * ```
97
+ *
98
+ * @since 0.4.0
99
+ *
100
+ **/
101
+ type PhoneticCode = Branded<string, 'PhoneticCode'>;
102
+
103
+ /**
104
+ * Упрощённая реализация алгоритма Daitch-Mokotoff для фонетического кодирования.
105
+ *
106
+ * Сложность: `O(n)` — один проход по строке.
107
+ *
108
+ * Преобразует строки в 6-значные коды, устойчивые к опечаткам, транслитерации и диалектным различиям.
109
+ * Поддерживает кириллицу через транслитерацию.
110
+ *
111
+ * @param input - Входная строка (может быть `null` / `undefined`)
112
+ * @returns 6-значный фонетический код
113
+ *
114
+ * @since 0.4.0
115
+ *
116
+ **/
117
+ declare function daitchMokotoffLite(input: string | null | undefined): PhoneticCode;
118
+
119
+ /**
120
+ * Параметры для работы с функцией {@link suggestClosest} — нечёткого поиска
121
+ * наиболее подходящего значения на основе ввода пользователя.
122
+ *
123
+ * Используется для настройки чувствительности и поведения при сравнении строк.
124
+ *
125
+ * @since 0.4.0
126
+ *
127
+ **/
128
+ interface SuggestOptions {
129
+ /**
130
+ * Максимальное расстояние Дамерау-Левенштейна, при котором значение
131
+ * считается допустимым кандидатом для подсказки. По умолчанию — `2`.
132
+ *
133
+ * Чем меньше значение, тем строже сравнение.
134
+ *
135
+ **/
136
+ maxDistance?: number;
137
+ /**
138
+ * Веса для комбинированного ранжира.
139
+ * Сумма не обязана быть 1 — нормализуется внутри.
140
+ */
141
+ weights?: {
142
+ phonetic?: number;
143
+ trigram?: number;
144
+ levenshtein?: number;
145
+ };
146
+ }
147
+ /**
148
+ * Предлагает наиболее близкое значение из списка допустимых,
149
+ * используя алгоритм Дамерау-Левенштейна для учёта опечаток.
150
+ *
151
+ * Функция предназначена для реализации подсказок вроде:
152
+ * "Вы имели в виду 'release'?", когда пользователь ввёл 'releas'.
153
+ *
154
+ * @param input Введённая пользователем строка, возможно, с опечаткой
155
+ * @param targetValues Список корректных, допустимых значений (например, команды, флаги)
156
+ * @param options Настройки нечёткого поиска
157
+ * @returns Наиболее близкое значение из `knownValues` или `undefined`, если совпадений нет
158
+ *
159
+ * @example
160
+ * ```ts
161
+ * suggestClosest('releas', ['release', 'publish']) // → 'release'
162
+ * suggestClosest('релиз', ['release', 'publish']) // → 'release'
163
+ * ```
164
+ * @since 0.4.0
165
+ *
166
+ **/
167
+ declare function suggestClosest(input: string, targetValues: readonly string[], options?: SuggestOptions): string | undefined;
168
+
169
+ export { daitchMokotoffLite, damerauLevenshtein, suggestClosest };
170
+ export type { DistanceResult, PhoneticCode, SuggestOptions };