Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Помощь запрашиваетДолганов СергейДолганов Сергей Долганов Сергей

Бэк: Создание библиотеки Refinement Types на Node.js (для построения контрактов)

Для продвинутых, задача на неделю

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Node.js.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

Польза: создать гибкую и универсальную Node библиотеку, вдохновленную функциональным программированием.

Советы по реализации

Что такое Refinement Type? Это контейнер c правилами валидации для произвольного значения.

Особенности:

  • валидация должна прогоняться отложенно (lazy);
  • только один раз на значение (мемоизация);
  • безопасный способ проверить является ли значение валидным — метод-предикат isValid;
  • при попытке извлечь значение (метод с названием unpack, например):

    1. если валидация еще не запускалась — запустить;
    2. если валидация запускалась и она прошла успешно, должно вернуться значение;
    3. если валидация запускалась и она прошла не успешно, должна произойти ошибка.

Простейшая композиция типов должна быть реализована по принципам Algebraic Data Types.

Если типы можно складывать и перемножать, появляется возможность создать систему типов произвольной сложности (например, для описания бизнес логики), что и нужно для контрактов.

Присылайте свои решения: