Skip to content

Commit

Permalink
Первая реализация библиотеки
Browse files Browse the repository at this point in the history
  • Loading branch information
sfaqer committed Aug 11, 2023
0 parents commit 391e686
Show file tree
Hide file tree
Showing 13 changed files with 645 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
build/
.vscode/
oscript_modules/
25 changes: 25 additions & 0 deletions LICENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
The MIT License (MIT)
=====================

Copyright © `2023` `Kirill Chernenko <[email protected]>`

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the “Software”), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
91 changes: 91 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# async

Асинх библиотека для реализации асинхронного взаимодействия для OneScript

## Программный интерфейс

### Модуль Асинхронность

#### ВыполнитьЛямбду

```bsl
// Выполняет асинхронно переданную лямбду
//
// Параметры:
// Алгоритм - Строка - Лямбда выражение которое требуется исполнить
// Объект - Сценарий - Объект который необходимо захватить в лямбду
// Параметры - Массив из Произвольный - Параметры алгоритма
//
// Возвращаемое значение:
// Обещание - Обещание о выполнении переданного алгоритма
//
Функция ВыполнитьЛямбду(Знач Алгоритм, Объект, Параметры)
```

#### ВыполнитьДелегат

```bsl
// Выполняет асинхронно переданный делегат
//
// Параметры:
// Действие - Действие - Делегат на метод который требуется исполнить
// Параметры - Массив из Произвольный - Параметры метода
//
// Возвращаемое значение:
// Обещание - Обещание о выполнении переданного метода
//
Функция ВыполнитьДелегат(Действие, Параметры)
```

### Класс Обещание

#### Получить

```bsl
// Получает результат исполнения обещания
//
// Параметры:
// Таймаут - Число - Время в миллисекундах в течении которого нужно ожидать завершения задания,
// если время ожидания будет превышено, будет выброшено исключение
//
// Возвращаемое значение:
// Произвольный - Результат исполнения обещания
//
Функция Получить(Таймаут = 0)
```

#### Затем

```bsl
// После получения результата запускает ещё одно задание которое будет асинхронно
// выполнять переданный алгоритм над результатом
//
// Параметры:
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает результат исполнения
// текущего обещания и возвращает новый результат
// - Действие - Делегат на функцию с одним параметром, которая принимает результат исполнения
// текущего обещания и возвращает новый результат
//
// Возвращаемое значение:
// Обещание - Обещание об исполнение алгоритма над результатом исполнения текущего обещания
//
Функция Затем(Знач Алгоритм)
```

#### Поймать

```bsl
// В случае если в нижестоящих обещаниях будет выброшено исключение, оно будет перехвачено
// и передано в указанный алгоритм.
//
// Параметры:
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает ИнформацияОбОшибке
// нижестоящих обещаний и возвращает новый результат
// - Действие - Делегат на функцию с одним параметром, которая принимает ИнформацияОбОшибке
// нижестоящих обещаний и возвращает новый результат
//
// Возвращаемое значение:
// Обещание - Обещание о выполнении алгоритма в случае возникновения исключения
//
Функция Поймать(Алгоритм)
```
16 changes: 16 additions & 0 deletions packagedef
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Описание.Имя("async")
.Версия("0.1.0")
.Автор("Кирилл Черненко")
.АдресАвтора("https://github.com/sfaqer")
.Описание("Фреймворк асинхронного исполнения для OneScript")
.ВерсияСреды("1.8.4")
.ВключитьФайл("src")
.ВключитьФайл("README.md")
.ВключитьФайл("LICENSE.md")
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("coverage")
.РазработкаЗависитОт("fs")
.РазработкаЗависитОт("json")
.РазработкаЗависитОт("asserts")
.ЗависитОт("lambdas", "0.1.3")
;
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#Область ОписаниеПеременных

Перем Алгоритм; // Алгоритм выполняемый асинхронно
Перем Параметры; // Параметры алгоритма
Перем Предыдущий; // Предыдущее обещание результат которого передаётся как параметр в алгоритм
Перем ПерехватчикИсключения; // Это обещание перехватчик исключения

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ПриСозданииОбъекта(пАлгоритм, пПараметры, пПерехватчикИсключения)

Если ТипЗнч(пПараметры) = Тип("Обещание") Тогда
Предыдущий = пПараметры;
Иначе
Параметры = пПараметры;
КонецЕсли;

Алгоритм = пАлгоритм;
ПерехватчикИсключения = пПерехватчикИсключения;

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

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

Функция Алгоритм() Экспорт
Возврат Алгоритм;
КонецФункции

Функция Параметры() Экспорт
Возврат Параметры;
КонецФункции

Функция Предыдущий() Экспорт
Возврат Предыдущий;
КонецФункции

Функция ПерехватчикИсключения() Экспорт
Возврат ПерехватчикИсключения;
КонецФункции

#КонецОбласти
111 changes: 111 additions & 0 deletions src/internal/Классы/Обещание.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#Использовать lambdas

#Область ОписаниеПеременных

Перем Задание; // Задание которое исполняет обещание

// Контекст исполнения обещания
Перем КонтекстВыполнения; // BSLLS:UnusedLocalVariable-off Доступ через рефлектор в служебном интерфейсе

#КонецОбласти

#Область ПрограммныйИнтерфейс

// Получает результат исполнения обещания
//
// Параметры:
// Таймаут - Число - Время в миллисекундах в течении которого нужно ожидать завершения задания,
// если время ожидания будет превышено, будет выброшено исключение
//
// Возвращаемое значение:
// Произвольный - Результат исполнения обещания
//
Функция Получить(Таймаут = 0) Экспорт

Дождались = Задание.ОжидатьЗавершения(Таймаут);

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

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

// После получения результата запускает ещё одно задание которое будет асинхронно
// выполнять переданный алгоритм над результатом
//
// Параметры:
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает результат исполнения
// текущего обещания и возвращает новый результат
// - Действие - Делегат на функцию с одним параметром, которая принимает результат исполнения
// текущего обещания и возвращает новый результат
//
// Возвращаемое значение:
// Обещание - Обещание об исполнение алгоритма над результатом исполнения текущего обещания
//
Функция Затем(Знач Алгоритм) Экспорт

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

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

КонецЕсли;

Результат = Новый Обещание(Алгоритм, ЭтотОбъект);

АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);

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

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

// В случае если в нижестоящих обещаниях будет выброшено исключение, оно будет перехвачено
// и передано в указанный алгоритм.
//
// Параметры:
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает ИнформацияОбОшибке
// нижестоящих обещаний и возвращает новый результат
// - Действие - Делегат на функцию с одним параметром, которая принимает ИнформацияОбОшибке
// нижестоящих обещаний и возвращает новый результат
//
// Возвращаемое значение:
// Обещание - Обещание о выполнении алгоритма в случае возникновения исключения
//
Функция Поймать(Алгоритм) Экспорт

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

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

КонецЕсли;

Результат = Новый Обещание(Алгоритм, ЭтотОбъект, Истина);

АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);

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

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ПриСозданииОбъекта(Алгоритм, Параметры, ПерехватчикИсключения = Ложь)

КонтекстВыполнения = Новый КонтекстВыполненияОбещания(
Алгоритм,
Параметры,
ПерехватчикИсключения
);

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

#КонецОбласти
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#Область ОписаниеПеременных

Перем Рефлектор; // Для доступа к приватным полям обещания

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

Процедура ЗапуститьВыполнениеОбещания(Обещание) Экспорт

Параметры = Новый Массив;
Параметры.Добавить(Обещание);

Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ВыполнитьОбещание", Параметры);

Рефлектор.УстановитьСвойство(Обещание, "Задание", Задание);

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

Функция ВыполнитьОбещание(Обещание) Экспорт

Контекст = Рефлектор.ПолучитьСвойство(
Обещание,
"КонтекстВыполнения"
);

Если Контекст.Предыдущий() <> Неопределено Тогда

Если Контекст.ПерехватчикИсключения() Тогда

Попытка
Результат = Контекст.Предыдущий()
.Получить();
Исключение
Результат = Контекст.Алгоритм()
.Выполнить(ИнформацияОбОшибке());
КонецПопытки;

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

Иначе

Возврат Контекст.Алгоритм()
.Выполнить(Контекст.Предыдущий().Получить());

КонецЕсли;

Иначе

Параметры = Контекст.Параметры();

СтрокаПараметров = Новый Массив();

Для Счетчик = 0 По Параметры.ВГраница() Цикл
СтрокаПараметров.Добавить(СтрШаблон("Параметры[%1]", Счетчик));
КонецЦикла;

Возврат Вычислить(СтрШаблон("Контекст.Алгоритм().Выполнить(%1)", СтрСоединить(СтрокаПараметров, ",")));

КонецЕсли;

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

#КонецОбласти

Рефлектор = Новый Рефлектор();
Loading

0 comments on commit 391e686

Please sign in to comment.