Всіх вітаю.
Нещодавно опановував функціональне програмування на C++, в результаті чого виникло розуміння, що по-хорошому треба занурюватися в co_routine — фічу, яка з’явилася у C++20.
В результаті написав свою лібу: coasync++, яка спрощує роботу з короутінами.
Як один із варіантів використання, вона дозволяє змінювати “лапшеобразний” код, який достатньо складно читабельний.
int main(int argc, char* arg[])
{
// Read some entity
ioReadTask(int id, [](SomeEntity &entity)
{
// Some business logic
// ...
// Write result back
ioWriteTask(entity, [](WriteResult &result)
{
// Some result processing
ioWriteAnotherTask(result, [](AnotherWriteResult &result)
{
//...
//...
//...
log();
});
});
});
}На щось більше зручне.
auto process(int entityId) -> asyc<void>
{
auto entity = co_await ioReadTask(entutyId);
auto result = co_await ioWriteTask(entity);
log(result);
}Це аналог async/await патерна із C#, але в C++20 дали не сам патерн, а структури, за допомогою яких можливо реалізувати свій async/await і не тільки. Тому і з’явилася ця ліба, яка завершує цей ланцюг і дає кінцевому девелоперу готовий інструмент.
Поки доступна альфа-версія ліби, яку я по можливості тестую та вдосконалюю, але зараз вже можна користуватися.
Видається під ліцензією MIT, тобто open source.
Тому якщо є потреба, користуйтеся.
Всім дякую за увагу.