(ns outliner.model.history) (def history-keys [:doc :view]) (defn record-history [doc view sys] (let [snapshot {:doc doc :view view}] (-> sys (update :undo-stack conj snapshot) (assoc :redo-stack [])))) (defn undo [doc view sys] (if-let [snapshot (peek (:undo-stack sys))] (let [current-snapshot {:doc doc :view view}] {:doc (:doc snapshot) :view (:view snapshot) :sys (-> sys (update :undo-stack pop) (update :redo-stack conj current-snapshot))}) {:doc doc :view view :sys sys})) (defn redo [doc view sys] (if-let [snapshot (peek (:redo-stack sys))] (let [current-snapshot {:doc doc :view view}] {:doc (:doc snapshot) :view (:view snapshot) :sys (-> sys (update :redo-stack pop) (update :undo-stack conj current-snapshot))}) {:doc doc :view view :sys sys})) (defn mark-edit [sys id] (assoc sys :last-edit-id id)) (defn clear-edit-marker [sys] (dissoc sys :last-edit-id))