Я пытаюсь построить concept of a Cursor в clojurescript, поддерживаемый атомом. Курсор представляет собой рекурсивный механизм застежки-молнии для редактирования неизменяемой вложенной связанной структуры данных.Clojure новичок, борющийся с протоколами
Я очень новичок в Clojure, вы можете помочь мне определить мои ошибки?
(defprotocol Cursor
(refine [this path])
(set [this value])
(value [this]))
(defn- build-cursor* [state-atom paths]
(reify Cursor
(set [this value] (swap! state-atom (assoc-in @state-atom paths value)))
(refine [this path] (build-cursor* state-atom (conj paths path)))
(value [this] (get-in @state-atom paths))))
(defn build-cursor [state-atom]
(build-cursor* state-atom []))
(comment
(def s (atom {:a 42}))
(def c (build-cursor s))
(assert (= (value c) {:a 42}))
(set c {:a 43}) ;; WARNING: Wrong number of args (2) passed to quiescent-json-editor.core/set at line 1 <cljs repl>
(assert (= (value c) {:a 43}))
(def ca (refine c :a)) ;; WARNING: Wrong number of args (2) passed to quiescent-json-editor.core/refine at line 1 <cljs repl>
(assert (= (value ca) 43))
(set ca 44)
(assert (= (value ca) 43))
)
JIRA вопрос для ассоциативного в с пустым путем: http://dev.clojure.org/jira/browse/CLJ-1520 – lnmx