Сравните значения двух спецификаций, Clojure.spec

Я определил спецификации как -

(s/def ::start integer?)
(s/def ::end integer?)
(s/def ::collection (s/keys :req-un [::start ::end]))

Работает нормально как (s/valid? ::collection {:start 9 :end 13})

Но теперь я также должен проверить, что start должно быть меньше, чем end. Как это сделать? Есть ли более простой способ сделать это без создания еще одной фн и проверки?


person Abhishek B Jangid    schedule 10.02.2018    source источник
comment
Пожалуйста, не забудьте принять ответ @edvorg, поскольку ваши комментарии указывают на то, что он решил вашу проблему. Спасибо!   -  person marco.m    schedule 28.02.2018


Ответы (1)


Определения s/def спецификации — это просто предикаты. Вы можете использовать s/and в теле спецификации ::collection, где первым условием будет то, что у вас есть в данный момент, а вторым — предикат порядка:

(s/def ::ordered-collection (fn [{:keys [start end]}] (< start end)))

(s/def ::collection (s/and (s/keys :req-un [::start ::end])
                           ::ordered-collection))
person edvorg    schedule 10.02.2018
comment
Выдает ошибку. Не удалось разрешить спецификацию: :structure clojure.spec.alpha/reg-resolve! (альфа.clj:69) - person Abhishek B Jangid; 10.02.2018
comment
Извините, исправил решение, не было возможности его проверить. Вы можете проверить правильную подпись для функции and, используя repl. - person edvorg; 10.02.2018