summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-03-17 11:17:00 +0800
committereltrac <hi@eltr.ac>2026-03-17 11:17:00 +0800
commita292b4e27d41729b745863c2fa1878cf1dee9f56 (patch)
treecdda7173fd5a752c38fe65c2a3dda10dc23b8232
parenta0bc9187ebfb20d34174d32dec497a7e5b279c63 (diff)
perf(storage): traverse lines lazily to find webmention, not reading whole file
-rw-r--r--src/weepinbell/storage.clj16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/weepinbell/storage.clj b/src/weepinbell/storage.clj
index 9ee7c32..dbee6b5 100644
--- a/src/weepinbell/storage.clj
+++ b/src/weepinbell/storage.clj
@@ -24,12 +24,16 @@
([id]
(get-wm id nil))
([source target]
- (let [data (load-data)
- pred (if target
- #(and (= source (get-in % [:webmention :source]))
- (= target (get-in % [:webmention :target])))
- #(= source (get-in % [:webmention :id])))]
- (first (filter pred data)))))
+ (with-open [r (io/reader data-file)]
+ (let [lines (line-seq r)
+ pred (if target
+ (fn [wm] (and (= source (get-in wm [:webmention :source]))
+ (= target (get-in wm [:webmention :target]))))
+ (fn [wm] (= source (get-in wm [:webmention :id]))))]
+ (->> lines
+ (map edn/read-string)
+ (filter pred)
+ first)))))
(defn first-line-empty? [path]
(with-open [rdr (io/reader path)]