Я следую Главе 6 книги Professional Clojure.
Состояние приложения в настоящее время определяется следующим образом:
(defonce app-state
(reagent/atom
{:projects
{"aaa"
{:title "Build Whip"
:stories
{1 {:title "Design a data model for projects and stories"
:status "done"
:order 1}
2 {:title "Create a story title entry form"
:order 2}
3 {:title "Implement a way to finish stories"
:order 3}}}}}))
Мне нужно использовать swap!
, чтобы добавить новый ключ значение для представления новой истории, идентифицируемое идентификатором со значением указанных полей.
(defn add-story! [app-state project-id title status] ;
; Q. How to use swap! to add a key value pair into :stories?
(swap! app-state update [:projects project-id :stories] assoc <- INCORRECT CODE HERE
(unique) {:title title
:status status
:order (inc (max-order app-state project-id))}))
Уникальная функция, не показанная здесь, просто генерирует любой уникальный uuid. Функция максимального порядка получает, ну, максимальный порядок. Мне пришлось изменить его, так как глава книги идет вразрез с фактическим поставленным окончательным кодом. Вот моя версия максимального порядка:
(defn max-order [app-state project-id]
(apply max 0 (map :order (vals (get-in @app-state [:projects project-id :stories])))))
Вопрос : Как я могу использовать swap!
, чтобы добавить новое значение ключа в :stories
?
I у него было go, но пока оно меня побивало.
У меня такое ощущение, что эта вложенная карта - не лучшее представление - в окончательном коде, представленном для загрузки, автор изменился на модель более реляционного типа с проектами и историями как объектами верхнего уровня, с истории, содержащие project_id, но было бы неплохо решить это первое использование swap!
, прежде чем перейти к этому.