        (let [empty-structure (empty structure)]
          (cond (and (list? empty-structure) (not (queue? empty-structure)))
             ;; this is done to maintain order, otherwise lists get reversed
+              ;;TODO: need to handle NONE here
                (doall (map next-fn structure))
 
                (map? structure)
             ;; reduce-kv is much faster than doing r/map through call to (into ...)
                (reduce-kv
                  (fn [m k v]
+                   ;;TODO: need to handle NONE here
                    (let [[newk newv] (next-fn [k v])]
                      (assoc m newk newv)))
 

    (walk/walk (partial walk-until pred on-match-fn) identity structure)))


(defrichnav
  ^{:doc "Navigates to the specified key, navigating to nil if it does not exist."}
  keypath*

(defn map-vals-non-transient-transform [structure empty-map next-fn]
  (reduce-kv
    (fn [m k v]
      (let [newv (next-fn v)]
        (if (identical? newv i/NONE)
          m
          (assoc m k newv))))
    empty-map
    structure))

