Как условно развернуть структуры данных Hiccup в Clojure
Как элегантно визуализировать условный список пунктов меню в структурах данных Clojure, похожих на Hiccup? Моя шаблонная функция завалена звонками into
и не читает естественно.
Желаемый результат:
[:div.menu
[:div.item "Home"]
[:div.item "Private"]
[:div.item "Private"]
[:div.item "Public"]
Если я положу личные вещи в if
Мне все еще нужно развернуть возвращенный вектор или разобраться с nil
так что это не работает:
[:div.menu
[:div.item "Home"]
(if authenticated?
[[:div.item "Private"]
[:div.item "Private"]])
[:div.item "Public"]]
Я нашел, что могу использовать (into [:div.menu] ...)
и передать список элементов, но это громоздко и не читается естественно. Я закончил с этим выражением:
(-> [:div.menu
[:div.item "Home"]]
(into (if (auth/authenticated?)
[[:div.item "Private"]
[:div.item "Private"]]
(into [[:div.item "Public"]]))
Есть ли способ лучше?
1 ответ
Оказывается, Hiccup обрабатывает списки не так, как векторы, поэтому вы можете вернуть () вместо [] и правильно развернуть его:
[:div.menu
[:div.item "Home"]
(if authenticated?
(list
[:div.item "Private"]
[:div.item "Private"]))
[:div.item "Public"]]