type Executable[T] = ExecutionContext ?=> Future[T]
Изначально я их воспринимал просто как возможность задавать красивые тайп-алиасы, чтобы не писать постоянно
(implicit ec: ExecutionContext). Но всё же это более мощный механизм, и Adam в своём посте это раскрывает.У меня глаз зацепился за один из примеров применения — проброс соединения к БД через методы для объединения их вызовов в одну транзакцию. То есть использование некоего
Connected[IO[T]] вместо ConnectionIO[T] из doobie. Это даёт больше гибкости в коде, но пропадает одна из моих любимых особенностей скаловых библиотек для работы с RDBMS: функции, обращающиеся к базе, оперируют специфичной монадкой (
ConnectionIO/DBIO), которая композится только с себеподобными, и не позволяет без костылей вкорячить в транзакцию какой-нибудь тормозной сайд-эффект. Разделять транзакционный код вокруг базы и внешние эффекты приложения на уровне типов — это здорово и безопасно.https://blog.softwaremill.com/context-is-king-20f533474cb3