Skip to content

Internal DSL for control flow of monadic computations in Scala

Notifications You must be signed in to change notification settings

eshlykov/monadsl

Repository files navigation

monadsl

Travis (.org) codecov

О проекте

monadsl — библиотека, предоставляющая внутренний DSL на Scala, с помощью которого можно легко выражать ветвление и прочие управляющие конструкции для монадических вычислений.

Мотивация

К монадическим выражениям неприменимы привычные управляющие конструкции, например if-else, так как тип результат обернут в монадический контейнер. Ниже один из вариантов записи ветвления:

for {
  ok <- e1
  result <- if (ok) e2 else e3
} yield result

Такая запись неизбежно замедляет как чтение этого кода, так и процесс написания, поскольку необходимо нагромождать сложные синтаксические конструкции вокруг элементарной логики.

С помощью DSL указанную выше конструкцию можно выразить в виде:

when (e1) e2 otherwise e3

Применение

Библиотека подойдет для приложений, в которых требуется выполнять рутинные проверки, например:

  1. Реализация бизнес-процессов, где объектам часто приписывают определенную стадию, от которой зависят допустимые действия;

  2. Валидация интегриционных инвариантов, то есть когда проверяется консистентность данных, полученных от внешних сервисов.

Демонстрационное приложение

В примерах лежит приложение, реализующее простейший API для трекера задач. TicketService, реализующий методы для работы с задачами, реализован в двух версиях, одна из которых использует DSL, а другая нет. В качестве монады здесь используется Future (из scala.concurrent), позволяющая выражать асинхронные вычисления.

Запуск

Для запуска нужно иметь установленную Scala, Docker Compose, make и иметь свободные порты 8080 и 5432. Если это так, то в корне репозитория достаточно позвать команду make. После этого UI приложения — Swagger — будет доступен на http://localhost:8080/swagger, а база данных — на порту 5432.

Список сценариев

Для демонстрации можно попробовать прогнать следующие сценарии:

  • создать задачу и довести ее до релиза (основной сценарий).
  • создать задачу, довести ее до тестирования и вернуть в разработку, после чего довести до релиза;
  • создать задачу и удалить как дубликат.

To-do List

В порядке приоритета.

  • Юнит-тесты и расчет покрытия.
  • CI.
  • Реализовать API для дополнительных сценариев.
  • Exception handler для красивого отображения ошибок.
  • Расширить модель: добавить assignee с ролями и отдельные права на редактирование задач.
  • Тесты на DAO.
  • Скрипт для проверки эквивалентности таблиц в базе данных.

About

Internal DSL for control flow of monadic computations in Scala

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages