для тестов?
Предположим ты имеешь такой сервис, сделанный, конечно же с помощью наиболее продвинутой либы https://github.com/aecor/liberator @free trait Service[F[ ]]{ def foo(): F[Foo] def bar(x: F[Foo]): F[Bar] }
У тебя есть продакшновый интепретатор для какой-нибудь Future или там Task Возможно даже его реализация выглядит как-то так implicit def serviceImpl[F[ ]: Req1 : Req2] = new Service[F]{ ... }
Здесь Req1, Req2 - сервисы, от которых зависит твоя имплементация. Теперь ты хочешь проверить, вызываются ли и в каком количестве методы Req1, Req2 в данной реализации. Вместо всяких грязных мокито, реализующих грязные прокси, ты делаешь монадку Writer[Map[String, Int], ?] Monoid[Map[String, Int]] на дефолтных инстансах будет работать как счётчик. После чего делаешь интепретаторы для Req1, Req2 ..., которые дописывают в этот счётчик вызов соответствующего метода и возвращают какие-то моковые данные. Используешь свою реализацию для этой монадки, и она моментально показывает тебе и результат и количество вызовов каждого метода на выходе
Вот такая задача получилась даже без фриманаток, на чистом finally tagless. Однако если ты вместо врайтера воспользуешься фриманатками для всех сервисов( а они тоже генерятся либератором из коробки) , в качестве результата ты фактически получишь план исполнения, который сможешь очень-очень подробно проверить вручную, если тебе нужно
Если этот рассказ тебя заинтриговал, могу попробовать раскатать это на хабре подробнее с кусками кода. Если нет - то нет
Обсуждают сегодня