Polish segment-router

This commit is contained in:
Tommi Reiman 2017-11-23 16:01:40 +02:00
parent 636c7ecd24
commit ec35c2ebbf

View file

@ -12,12 +12,6 @@
(-insert [this ps data]) (-insert [this ps data])
(-lookup [this ps params])) (-lookup [this ps params]))
(defn- segments [^String path]
(mapv
(fn [^String p]
(if (impl/wild-param? p) (-> p (subs 1) keyword) p))
(.split path "/")))
;; TODO: catch-all ;; TODO: catch-all
(defn- segment (defn- segment
([] ([]
@ -29,22 +23,30 @@
(-insert [_ [p & ps] data] (-insert [_ [p & ps] data]
(if-not p (if-not p
(segment children wilds data) (segment children wilds data)
(let [wilds (if (keyword? p) (conj wilds p) wilds) (let [wild (impl/wild-param p)
children (update children p #(-insert (or % (segment)) ps data))] wilds (if wild (conj wilds wild) wilds)
(segment children wilds data)))) children (update children (or wild p) #(-insert (or % (segment)) ps data))]
(segment children wilds nil))))
(-lookup [_ [p & ps] params] (-lookup [_ [p & ps] params]
(if (nil? p) (if (nil? p)
(assoc data :params params) (if data (assoc data :params params))
(or (-lookup (impl/fast-get children' p) ps params) (or (-lookup (impl/fast-get children' p) ps params)
(some #(-lookup (impl/fast-get children' %) ps (assoc params % p)) wilds)))))))) (some #(-lookup (impl/fast-get children' %) ps (assoc params % p)) wilds))))))))
(defn create [paths] (defn create [paths]
(reduce (reduce
(fn [segment [p data]] (fn [segment [p data]]
(let [ps (segments p)] (let [ps (impl/segments p)]
(-insert segment ps (map->Match {:data data})))) (-insert segment ps (map->Match {:data data}))))
(segment) paths)) (segment) paths))
(defn lookup [segment ^String path] (defn lookup [segment ^String path]
(let [ps (.split path "/")] (let [ps (.split path "/")]
(-lookup segment ps {}))) (-lookup segment ps {})))
(comment
(-> [["/:abba" 1]
["/kikka/*kakka" 2]]
(create)
(lookup "/kikka")
(./aprint)))