Сначала я бы подумал о том, как лучше всего отобразить ваши функциональные операции в потоке:
- Сгруппировать условие / ключ / значение в чанк
- Фильтровать чанки, гдеусловие не соответствует действительности
- Отбросьте условия
- Сгладьте куски
- Создайте карту из результата
Что выглядит следующим образом:
(def coll [true :a "v1" false :b "v2" true :c "v3"])
(apply hash-map
(flatten
(map #(drop 1 %)
(filter #(first %)
(partition 3 coll)))))
Или, если вы чувствуете себя неловко:
(->> coll
(partition 3)
(filter #(first %))
(map #(drop 1 %))
flatten
(apply hash-map))
Я не уверен, что это элегантно или кратко, но я думаю, что его легко прочитать.Обратите внимание, что если вы часто имеете дело с данными в этой форме, вы можете обнаружить, что такие шаги, как (раздел 3 coll) или (first%), могут быть полезными повторно используемыми функциями сами по себе, приводя к чему-то вроде:
(defn condition-group [coll] (partition 3 coll))
(defn condition [group] (first group))
(defn but-condition [group] (drop 1 group))
(defn kv-map [kv-pairs] (apply hash-map (flatten kv-pairs)))
(->> coll
condition-group
(filter condition)
(map but-condition)
kv-map)