   ;; 1.3ms (dissoc wild & catch-all from children)
   ;; 1.3ms (reified protocols)
   ;; 0.8ms (flattened matching)
+  ;; 0.8ms (return route-data)
   (cc/quick-bench (dotimes [_ 1000] (lookup tree-new "/v1/orgs/1/topics" {}))))

                (or (lookup child path' params)
                    (lookup ?wild path' params)
                    (lookup ?catch path' params))))
            (assoc params param path))))
      (get-segment [this]
        segment)
      (add-child [this key child]
        (wild-node segment param (assoc children key child)))
      (insert-child [this key path-spec o]
        (wild-node segment param (update children key insert path-spec o))))))

(defn catch-all-node [segment children param]
  (reify
    Node
    (lookup [this path params]
      (assoc params param path))
    (get-segment [this]
      segment)))

(defn static-node [^String segment children]
  (let [size (count segment)
        ?wild (maybe-wild-node children)
        ?catch (maybe-catch-all-node children)

  (lookup [_ _ _])
  (get-segment [this]))

(defrecord Match [data params])

(defn wild-node [segment param children data]
  (let [?wild (maybe-wild-node children)
        ?catch (maybe-catch-all-node children)
        children' (impl/fast-map children)]
