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