                 (add-point* data [])
                 (commit-path path))))
         (commit-path (assoc this :data p) path)))))
+
+(defn delete-point*
+  [this p path]
+  (if (:children this)
+    (let [[c i] (child-for-point this p)]
+      (if c
+        (delete-point* c p (conj path [this i]))
+        (or (ffirst path) this)))
+    (if (m/delta= p (:data this))
+      (if (seq path)
+        (let [[p i] (peek path)
+              p (assoc-in p [:children i] nil)]
+          (commit-prune p (pop path)))
+        (assoc this :data nil))
+      (or (ffirst path) this))))
 
 (def ^{:const true :private true} qt-children [nil nil nil nil])
 (def ^{:const true :private true} ot-children [nil nil nil nil nil nil nil nil])


(defn commit-path
  [node path]
  (loop [node node path path]
    (if (seq path)
      (let [[parent i] (peek path)]
        (recur
         (->> node (assoc (:children parent) i) (assoc parent :children))
         (pop path)))
      node)))

(defn add-point*

    (let [data (:data this)]
      (if data
        (if (m/delta= data p)
          (or (ffirst path) this)
          (let [n (split-node this)
                [c i] (make-child-for-point n p true)]
            (-> n
