Я не знаю ни одной подобной функции в clojure.core
, и я не сталкивался с существующей библиотекой, которая рекламирует это.
Глядя на реализацию some
в clojure.core
, она использует recur
, но для once?
вам понадобится механизм, чтобы запомнить, если вы видели значение true
ранее. Делать это внутреннее значение видимым в виде трехчастного вызова кажется уродливым Кроме того, я хотел бы избежать полного обхода коллекции, если в этом нет необходимости.
Следовательно, я бы go с уменьшением:
(defn once? [pred coll]
(reduce
(fn once-reduce-fn [seen-true it]
(if (pred it)
(if seen-true
(reduced false)
true)
seen-true))
false
coll))
;; You can use this code under the Apache Software License 2.0
;; in addition to StackOverflow defaults
Прекращает итерацию коллекции, когда видит второй истинный результат предиката, который также работает с пустыми коллекциями или nil
.