   have to unzip and zip the tree for each added move. If
   remove-existing-moves? is true, any previously existing moves at the point
   of insertion are removed."
-  [game san-moves & {:keys [node-id remove-existing-moves?]
-                     :or {node-id (current-node-id game)}}]
-  (add-move-sequence game board/move-from-san san-moves
-                     node-id
-                     remove-existing-moves?))
+  [game san-moves & {:keys [node-id remove-existing-moves?]}]
+  (let [node-id (or node-id (current-node-id game))]
+    (add-move-sequence game board/move-from-san san-moves
+                       node-id
+                       remove-existing-moves?)))
 
 
 (defn add-uci-move-sequence

  "Removes a node (by default, the current node) from the game, and returns
  a modified game with the current node set to the parent of the deleted
  node."
  [game & {:keys [node-id] :or {node-id (current-node-id game)}}]
  (let [z (game-zip game node-id)
        zr (zip/remove z)]
    (assoc game :root-node (zip/root zr)
                :current-node (if (= (zip/up z) (zip/prev z))

  added as the last child. If no node id is supplied, the current node of the
  game is used. If remove-existing-moves? is true, any previously existing
  moves at the point of insertion are removed."
  [game byte-move & {:keys [node-id remove-existing-moves?]}]
  (let [node-id (or node-id (current-node-id game))]
    (add-move game board/move-from-byte byte-move
              node-id remove-existing-moves?)))


(defn add-map-move
