Как условно развернуть структуры данных 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"]]
Другие вопросы по тегам