feat(undo): add multiple repo support

pull/1656/head
defclass 2021-04-11 23:41:33 +08:00
parent 07c25097c0
commit e218a8823d
1 changed files with 34 additions and 11 deletions

View File

@ -7,32 +7,55 @@
;;;; APIs ;;;; APIs
(def undo-stack (atom [])) (def ^:private undo-redo-states (atom {}))
(def redo-stack (atom []))
(defn- get-state
[]
(let [repo (state/get-current-repo)]
(assert (string? repo) "Repo should satisfy string?")
(if-let [state (get @undo-redo-states repo)]
state
(let [new-state {:undo-stack (atom [])
:redo-stack (atom [])}]
(swap! undo-redo-states assoc repo new-state)
new-state))))
(defn- get-undo-stack
[]
(-> (get-state) :undo-stack))
(defn- get-redo-stack
[]
(-> (get-state) :redo-stack))
(defn push-undo (defn push-undo
[txs] [txs]
(swap! undo-stack conj txs)) (let [undo-stack (get-undo-stack)]
(swap! undo-stack conj txs)))
(defn pop-undo (defn pop-undo
[] []
(when-let [removed-e (peek @undo-stack)] (let [undo-stack (get-undo-stack)]
(swap! undo-stack pop) (when-let [removed-e (peek @undo-stack)]
removed-e)) (swap! undo-stack pop)
removed-e)))
(defn push-redo (defn push-redo
[txs] [txs]
(swap! redo-stack conj txs)) (let [redo-stack (get-redo-stack)]
(swap! redo-stack conj txs)))
(defn pop-redo (defn pop-redo
[] []
(when-let [removed-e (peek @redo-stack)] (let [redo-stack (get-redo-stack)]
(swap! redo-stack pop) (when-let [removed-e (peek @redo-stack)]
removed-e)) (swap! redo-stack pop)
removed-e)))
(defn reset-redo (defn reset-redo
[] []
(reset! redo-stack [])) (let [redo-stack (get-redo-stack)]
(reset! redo-stack [])))
(defn get-txs (defn get-txs
[redo? txs] [redo? txs]