Skip to content

Commit

Permalink
Оптимизация создания делегатам по лямбда выражениям, теперь не создаю…
Browse files Browse the repository at this point in the history
…тся в случае если не будут исполнены
  • Loading branch information
sfaqer committed Jan 25, 2025
1 parent 9bb4456 commit 59f6e91
Show file tree
Hide file tree
Showing 11 changed files with 86 additions and 120 deletions.
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Описание.Имя("collectionos")
.Версия("0.7.0")
.Версия("0.7.1")
.Автор("Кирилл Черненко")
.АдресАвтора("https://github.com/sfaqer")
.Описание("Фреймворк коллекций для OneScript")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
КонецПроцедуры

Процедура ДляКаждогоОставшегося(Знач Действие, Знач Контекст = Неопределено) Экспорт


Если Не ЕстьСледующий() Тогда
Возврат;
КонецЕсли;

Если ТипЗнч(Действие) = Тип("Строка") Тогда

Действие = Лямбда.Выражение(Действие)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
КонецПроцедуры

Процедура ДляКаждогоОставшегося(Знач Действие, Знач Контекст = Неопределено) Экспорт


Если Не ЕстьСледующий() Тогда
Возврат;
КонецЕсли;

Если ТипЗнч(Действие) = Тип("Строка") Тогда

Действие = Лямбда.Выражение(Действие)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,11 @@
КонецПроцедуры

Процедура ДляКаждогоОставшегося(Знач Действие, Знач Контекст = Неопределено) Экспорт


Если Не ЕстьСледующий() Тогда
Возврат;
КонецЕсли;

Если ТипЗнч(Действие) = Тип("Строка") Тогда

Действие = Лямбда.Выражение(Действие)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@

Процедура ДляКаждого(Знач Алгоритм, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат;
КонецЕсли;

Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда

Алгоритм = Лямбда.Выражение(Алгоритм)
Expand Down Expand Up @@ -191,25 +195,25 @@

Функция ВычислитьЕслиОтсутствует(Ключ, Знач ФункцияНазначения, Знач Контекст = Неопределено) Экспорт

Если ТипЗнч(ФункцияНазначения) = Тип("Строка") Тогда
ФункцияНазначения = Лямбда.Выражение(ФункцияНазначения)
.Интерфейс(ФункциональныеИнтерфейсы.УниФункция());
НовоеЗначение = Неопределено;
ТекущееЗначение = Получить(Ключ);

Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
ФункцияНазначения.Контекст(Контекст);
Иначе
ФункцияНазначения.ЗахватитьОбъект(Контекст);
КонецЕсли;
Если ТекущееЗначение.Пустой() Тогда

ФункцияНазначения = ФункцияНазначения.ВДействие();
Если ТипЗнч(ФункцияНазначения) = Тип("Строка") Тогда
ФункцияНазначения = Лямбда.Выражение(ФункцияНазначения)
.Интерфейс(ФункциональныеИнтерфейсы.УниФункция());

КонецЕсли;
Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
ФункцияНазначения.Контекст(Контекст);
Иначе
ФункцияНазначения.ЗахватитьОбъект(Контекст);
КонецЕсли;

НовоеЗначение = Неопределено;
ТекущееЗначение = Получить(Ключ);
ФункцияНазначения = ФункцияНазначения.ВДействие();

Если ТекущееЗначение.Пустой() Тогда
КонецЕсли;

НовоеЗначение = ФункцияНазначения.Выполнить(Ключ);

Expand All @@ -231,24 +235,24 @@

Функция ВычислитьЕслиПрисутствует(Ключ, Знач ФункцияПереназначения, Знач Контекст = Неопределено) Экспорт

Если ТипЗнч(ФункцияПереназначения) = Тип("Строка") Тогда
ФункцияПереназначения = Лямбда.Выражение(ФункцияПереназначения)
.Интерфейс(ФункциональныеИнтерфейсы.БиФункция());
НовоеЗначение = Неопределено;

Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
ФункцияПереназначения.Контекст(Контекст);
Иначе
ФункцияПереназначения.ЗахватитьОбъект(Контекст);
КонецЕсли;
Если СодержитКлюч(Ключ) Тогда

ФункцияПереназначения = ФункцияПереназначения.ВДействие();
Если ТипЗнч(ФункцияПереназначения) = Тип("Строка") Тогда
ФункцияПереназначения = Лямбда.Выражение(ФункцияПереназначения)
.Интерфейс(ФункциональныеИнтерфейсы.БиФункция());

КонецЕсли;
Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
ФункцияПереназначения.Контекст(Контекст);
Иначе
ФункцияПереназначения.ЗахватитьОбъект(Контекст);
КонецЕсли;

НовоеЗначение = Неопределено;
ФункцияПереназначения = ФункцияПереназначения.ВДействие();

Если СодержитКлюч(Ключ) Тогда
КонецЕсли;

СтароеЗначение = Получить(Ключ);
НовоеЗначение = ФункцияПереназначения.Выполнить(Ключ, СтароеЗначение.Получить());
Expand Down Expand Up @@ -336,6 +340,10 @@

Процедура ЗаменитьВсе(Знач ФункцияПереназначения, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат;
КонецЕсли;

Если ТипЗнч(ФункцияПереназначения) = Тип("Строка") Тогда

ФункцияПереназначения = Лямбда.Выражение(ФункцияПереназначения)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@

Функция УдалитьЕсли(Знач Предикат, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат Ложь;
КонецЕсли;

Если ТипЗнч(Предикат) = Тип("Строка") Тогда

Предикат = Лямбда.Выражение(Предикат)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,7 @@
КонецФункции

Процедура ДляКаждого(Знач Алгоритм, Знач Контекст = Неопределено) Экспорт

Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда

Алгоритм = Лямбда.Выражение(Алгоритм)
.Интерфейс(ФункциональныеИнтерфейсы.УниПроцедура());

Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
Алгоритм.Контекст(Контекст);
Иначе
Алгоритм.ЗахватитьОбъект(Контекст);
КонецЕсли;

Алгоритм = Алгоритм.ВДействие();

КонецЕсли;

Для каждого КлючИЗначение Из Соответствие Цикл
Алгоритм.Выполнить(КлючИЗначение.Ключ);
КонецЦикла;

Итератор().ДляКаждогоОставшегося(Алгоритм, Контекст);
КонецПроцедуры

Функция Содержит(Элемент) Экспорт
Expand Down Expand Up @@ -156,6 +136,10 @@

Функция УдалитьЕсли(Знач Предикат, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат Ложь;
КонецЕсли;

Если ТипЗнч(Предикат) = Тип("Строка") Тогда

Предикат = Лямбда.Выражение(Предикат)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,7 @@
КонецФункции

Процедура ДляКаждого(Знач Алгоритм, Знач Контекст = Неопределено) Экспорт

Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда

Алгоритм = Лямбда.Выражение(Алгоритм)
.Интерфейс(ФункциональныеИнтерфейсы.УниПроцедура());

Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
Алгоритм.Контекст(Контекст);
Иначе
Алгоритм.ЗахватитьОбъект(Контекст);
КонецЕсли;

Алгоритм = Алгоритм.ВДействие();

КонецЕсли;

Итератор().ДляКаждогоОставшегося(Алгоритм, Контекст);

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

Функция Содержит(Элемент) Экспорт
Expand Down Expand Up @@ -150,6 +132,10 @@

Функция УдалитьЕсли(Знач Предикат, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат Ложь;
КонецЕсли;

Если ТипЗнч(Предикат) = Тип("Строка") Тогда

Предикат = Лямбда.Выражение(Предикат)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,7 @@
КонецФункции

Процедура ДляКаждого(Знач Алгоритм, Знач Контекст = Неопределено) Экспорт

Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда

Алгоритм = Лямбда.Выражение(Алгоритм)
.Интерфейс(ФункциональныеИнтерфейсы.УниПроцедура());

Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
Алгоритм.Контекст(Контекст);
Иначе
Алгоритм.ЗахватитьОбъект(Контекст);
КонецЕсли;

Алгоритм = Алгоритм.ВДействие();

КонецЕсли;

Итератор().ДляКаждогоОставшегося(Алгоритм, Контекст);

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

Функция Содержит(Элемент) Экспорт
Expand Down Expand Up @@ -151,6 +133,10 @@

Функция УдалитьЕсли(Знач Предикат, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат Ложь;
КонецЕсли;

Если ТипЗнч(Предикат) = Тип("Строка") Тогда

Предикат = Лямбда.Выражение(Предикат)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,7 @@
КонецФункции

Процедура ДляКаждого(Знач Алгоритм, Знач Контекст = Неопределено) Экспорт

Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда

Алгоритм = Лямбда.Выражение(Алгоритм)
.Интерфейс(ФункциональныеИнтерфейсы.УниПроцедура());

Если ТипЗнч(Контекст) = Тип("Структура")
Или ТипЗнч(Контекст) = Тип("ФиксированнаяСтруктура") Тогда
Алгоритм.Контекст(Контекст);
Иначе
Алгоритм.ЗахватитьОбъект(Контекст);
КонецЕсли;

Алгоритм = Алгоритм.ВДействие();

КонецЕсли;

Итератор().ДляКаждогоОставшегося(Алгоритм, Контекст);

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

Функция Содержит(Элемент) Экспорт
Expand Down Expand Up @@ -183,6 +165,10 @@

Функция УдалитьЕсли(Знач Предикат, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат Ложь;
КонецЕсли;

Если ТипЗнч(Предикат) = Тип("Строка") Тогда

Предикат = Лямбда.Выражение(Предикат)
Expand Down Expand Up @@ -274,6 +260,10 @@

Процедура ЗаменитьВсе(Знач Алгоритм, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат;
КонецЕсли;

Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда

Алгоритм = Лямбда.Выражение(Алгоритм)
Expand All @@ -298,6 +288,10 @@

Процедура Сортировать(Знач СравнениеЗначений, Знач Контекст = Неопределено) Экспорт

Если Пусто() Тогда
Возврат;
КонецЕсли;

Если ТипЗнч(СравнениеЗначений) = Тип("Строка") Тогда

СравнениеЗначений = Лямбда.Выражение(СравнениеЗначений)
Expand Down
20 changes: 6 additions & 14 deletions tests/ТестМодуль/ТестМодуль.os
Original file line number Diff line number Diff line change
Expand Up @@ -61,30 +61,22 @@

КонецЦикла;

Попытка
ФоновыеЗадания.ОжидатьЗавершенияЗадач();
Исключение

ИнформацияОбОшибке = ИнформацияОбОшибке();
Сообщить(ТипЗнч(ИнформацияОбОшибке));
Если ИнформацияОбОшибке.Параметры <> Неопределено И ИнформацияОбОшибке.Параметры.Количество() > 0 Тогда
ИнформацияОбОшибке = ИнформацияОбОшибке.Параметры[0].ИнформацияОбОшибке;
КонецЕсли;
ФоновыеЗадания.ОжидатьВсе(Задания);

ФоновыеЗадания.Очистить();
Для каждого ФоновоеЗадание Из Задания Цикл

ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
ВызватьИсключение ФоновоеЗадание.ИнформацияОбОшибке;
КонецЕсли;

КонецПопытки;
КонецЦикла;

Результаты = Новый Массив;

Для каждого ФоновоеЗадание Из Задания Цикл
Результаты.Добавить(ФоновоеЗадание.Результат);
КонецЦикла;

ФоновыеЗадания.Очистить();

Возврат Результаты;

КонецФункции
Expand Down

0 comments on commit 59f6e91

Please sign in to comment.