Skip to content

Commit 09b6b9e

Browse files
committed
Fix #10. Добавлен метод flatMap/Развернуть
1 parent 57cd70d commit 09b6b9e

File tree

4 files changed

+133
-0
lines changed

4 files changed

+133
-0
lines changed

README.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
* Пропустить
1919
* Различные
2020
* Обработать
21+
* Развернуть
2122
* Фильтровать
2223
* Сортировать
2324
* СортироватьПо
@@ -254,6 +255,46 @@
254255
Функция Обработать(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт
255256
```
256257

258+
#### Развернуть
259+
260+
```bsl
261+
// Развернуть каждый элемент коллекции в процессор коллекций.
262+
// Позволяет расширить имеющуюся коллекцию.
263+
// Например, разворачивание массива массивов сделает новый массив, содерщщий все элементы всех массивов.
264+
// Конвейерный метод.
265+
//
266+
// Параметры:
267+
// ФункцияРазворачивания - Строка, ОписаниеОповещения - функция разворачивания.
268+
// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные
269+
// "Результат", "ДополнительныеПараметры", "Элемент".
270+
// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра
271+
// (имена произвольные):
272+
// Результат - ПроцессорКоллекций - Переменная, в которую должен быть
273+
// помещен результат работы функции в виде ПроцессораКоллекций.
274+
// ДополнительныеПараметры - Структура - Структура параметров, передаваемая функции разворачивания.
275+
//
276+
// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции разворачивания.
277+
// Служит для передачи дополнительных данных из прикладного кода в функцию разворачивания.
278+
// По умолчанию содержит одно значение - Элемент.
279+
//
280+
// Возвращаемое значение:
281+
// ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
282+
//
283+
// Примеры:
284+
// 1:
285+
// ПроцессорКоллекций.Развернуть("Результат = ПроцессорыКоллекций.ИзСтроки(Элемент);");
286+
//
287+
// 2:
288+
// Процедура МояФункцияРазворачивания(Результат, ДополнительныеПараметры) Экспорт
289+
// Результат = ПроцессорыКоллекций.ИзСтроки(ДополнительныеПараметры.Элемент);
290+
// КонецПроцедуры
291+
//
292+
// ФункцияРазворачивания = Новый ОписаниеОповещения("МояФункцияРазворачивания", ЭтотОбъект);
293+
// ПроцессорКоллекций.Развернуть(ФункцияРазворачивания);
294+
//
295+
Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт
296+
```
297+
257298
#### Фильтровать
258299

259300
```bsl

src/internal/Классы/ПроцессорКоллекцийСлужебный.os

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,36 @@
151151

152152
КонецПроцедуры
153153

154+
Процедура ВыполнитьРазвернуть(Результат, ДополнительныеПараметры) Экспорт
155+
156+
Обработчик = ДополнительныеПараметры.Обработчик;
157+
158+
Лог.Отладка("ВыполнитьРазвернуть %1", Обработчик.ИмяПроцедуры);
159+
160+
Результат = Новый Массив;
161+
162+
Если Обработчик.ДополнительныеПараметры = Неопределено Тогда
163+
Обработчик.ДополнительныеПараметры = Новый Структура;
164+
КонецЕсли;
165+
Обработчик.ДополнительныеПараметры.Вставить("Элемент");
166+
167+
Для Каждого Элемент Из Коллекция Цикл
168+
Обработчик.ДополнительныеПараметры.Элемент = Элемент;
169+
РезультатРазворачивания = Элемент;
170+
ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатРазворачивания);
171+
172+
ДСО = СтрШаблон("Результат разворачивания для элемента %1 должен иметь тип ПроцессорКоллекций", Элемент);
173+
Ожидаем.Что(РезультатРазворачивания, ДСО).ИмеетТип("ПроцессорКоллекций");
174+
175+
РезультатРазворачивания.ДляКаждого(
176+
"ДополнительныеПараметры.Результат.Добавить(Элемент);",
177+
Новый Структура("Результат", Результат)
178+
);
179+
180+
КонецЦикла;
181+
182+
КонецПроцедуры
183+
154184
Процедура ВыполнитьСортировать(Результат, ДополнительныеПараметры) Экспорт
155185

156186
Обработчик = ДополнительныеПараметры.Обработчик;

src/Классы/ПроцессорКоллекций.os

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,52 @@
155155

156156
КонецФункции
157157

158+
// Развернуть каждый элемент коллекции в процессор коллекций.
159+
// Позволяет расширить имеющуюся коллекцию.
160+
// Например, разворачивание массива массивов сделает новый массив, содерщщий все элементы всех массивов.
161+
// Конвейерный метод.
162+
//
163+
// Параметры:
164+
// ФункцияРазворачивания - Строка, ОписаниеОповещения - функция разворачивания.
165+
// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные
166+
// "Результат", "ДополнительныеПараметры", "Элемент".
167+
// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра
168+
// (имена произвольные):
169+
// Результат - ПроцессорКоллекций - Переменная, в которую должен быть
170+
// помещен результат работы функции в виде ПроцессораКоллекций.
171+
// ДополнительныеПараметры - Структура - Структура параметров, передаваемая функции разворачивания.
172+
//
173+
// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции разворачивания.
174+
// Служит для передачи дополнительных данных из прикладного кода в функцию разворачивания.
175+
// По умолчанию содержит одно значение - Элемент.
176+
//
177+
// Возвращаемое значение:
178+
// ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
179+
//
180+
// Примеры:
181+
// 1:
182+
// ПроцессорКоллекций.Развернуть("Результат = ПроцессорыКоллекций.ИзСтроки(Элемент);");
183+
//
184+
// 2:
185+
// Процедура МояФункцияРазворачивания(Результат, ДополнительныеПараметры) Экспорт
186+
// Результат = ПроцессорыКоллекций.ИзСтроки(ДополнительныеПараметры.Элемент);
187+
// КонецПроцедуры
188+
//
189+
// ФункцияРазворачивания = Новый ОписаниеОповещения("МояФункцияРазворачивания", ЭтотОбъект);
190+
// ПроцессорКоллекций.Развернуть(ФункцияРазворачивания);
191+
//
192+
Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт
193+
194+
Если ТипЗнч(ФункцияРазворачивания) = Тип("Строка") Тогда
195+
ФункцияРазворачивания = СформироватьВременноеОписаниеОповещения(ФункцияРазворачивания, ДополнительныеПараметры);
196+
КонецЕсли;
197+
ДополнитьСтруктуру(ФункцияРазворачивания.ДополнительныеПараметры, ДополнительныеПараметры, Истина);
198+
199+
ПоложитьЯчейкуВКонвейер("Развернуть", ФункцияРазворачивания);
200+
Возврат ЭтотОбъект;
201+
202+
КонецФункции
203+
158204
// Фильтровать коллекцию по условию.
159205
// Конвейерный метод.
160206
//

tests/КонвейерныеМетоды.os

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
ВсеТесты.Добавить("ТестДолжен_ПропуститьНесколькоЭлементов");
3535
ВсеТесты.Добавить("ТестДолжен_ПолучитьРазличныеЭлементы");
3636
ВсеТесты.Добавить("ТестДолжен_ПолучитьУвеличитьВсеЭлементыНаЕдиницуЧерезОбработку");
37+
ВсеТесты.Добавить("ТестДолжен_СобратьДваПроцессораВОдин");
3738
ВсеТесты.Добавить("ТестДолжен_ОтфильтроватьЭлементыМеньшеДвух");
3839
ВсеТесты.Добавить("ТестДолжен_ОтсортироватьЭлементы");
3940
ВсеТесты.Добавить("ТестДолжен_ОтсортироватьТаблицуПоКолонке");
@@ -86,6 +87,21 @@
8687
КонецЦикла;
8788
КонецПроцедуры
8889

90+
Процедура ТестДолжен_СобратьДваПроцессораВОдин() Экспорт
91+
92+
ПроцессорКоллекций = ПолучитьПроцессорКоллекций();
93+
Результат = ПроцессорКоллекций.Развернуть(
94+
"Массив = Новый Массив;
95+
|Массив.Добавить(Элемент);
96+
|Массив.Добавить(Элемент + 1);
97+
|Результат = ПроцессорыКоллекций.ИзКоллекции(Массив)"
98+
).Фильтровать("Результат = Элемент = 2")
99+
.Количество();
100+
101+
Ожидаем.Что(Результат, "Процессоры коллекций должны сложиться и отфильтроваться").Равно(3);
102+
103+
КонецПроцедуры
104+
89105
Процедура ТестДолжен_ОтфильтроватьЭлементыМеньшеДвух() Экспорт
90106
ПроцессорКоллекций = ПолучитьПроцессорКоллекций();
91107
Результат = ПроцессорКоллекций.Фильтровать("Результат = Элемент < 2").ВМассив();

0 commit comments

Comments
 (0)