summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-03-17 11:46:45 +0800
committereltrac <hi@eltr.ac>2026-03-17 11:46:45 +0800
commitdf4fef27fb0bd64ba64ca5a08302c6eafc6cbdfb (patch)
tree566a417f5bef73b92b80ae4e5679f768c9378bb9
parenta292b4e27d41729b745863c2fa1878cf1dee9f56 (diff)
perf(storage): get/delete webmention lazily
also done some refactoring and DRY
-rw-r--r--src/weepinbell/storage.clj51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/weepinbell/storage.clj b/src/weepinbell/storage.clj
index dbee6b5..859eca7 100644
--- a/src/weepinbell/storage.clj
+++ b/src/weepinbell/storage.clj
@@ -19,21 +19,38 @@
(when-let [data-with-string (map pr-str data)]
(spit data-file (join "\n" data-with-string))))
+;; predicates used for filtering webmention
+(defn- st-pair-equal-pred [source target wm]
+ (and (= source (get-in wm [:webmention :source]))
+ (= target (get-in wm [:webmention :target]))))
+(defn- id-equal-pred [id wm]
+ (= id (get-in wm [:webmention :id])))
+(defn- get-predicate [source target]
+ (if target
+ #(st-pair-equal-pred source target %)
+ #(id-equal-pred source %)))
+;; end predicates
+
+(defn with-webmentions
+ "Opens the data file and applies function f to a lazy sequence of parsed Webmentions."
+ [f]
+ (with-open [r (io/reader data-file)]
+ (->> (line-seq r)
+ (map edn/read-string)
+ f)))
+
(defn get-wm
- "Get a Webmention by source/target or by ID."
- ([id]
- (get-wm id nil))
+ ([id] (get-wm id nil))
([source target]
- (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)))))
+ (let [pred (get-predicate source target)]
+ (with-webmentions
+ #(first (filter pred %))))))
+(defn delete-wm
+ ([id] (delete-wm id nil))
+ ([source target]
+ (let [pred (get-predicate source target)]
+ (with-webmentions
+ #(->> % (remove pred) unload-data)))))
(defn first-line-empty? [path]
(with-open [rdr (io/reader path)]
@@ -47,14 +64,6 @@
line (str newline? (pr-str data))]
(spit data-file line :append true)))
-(defn delete-wm
- "Delete a Webmention entry by source and target."
- [source target]
- (when-let [wm (get-wm source target)]
- (->> (load-data)
- (remove #(= wm %))
- unload-data)))
-
(defn update-wm
"Update an existing webmention"
[source target new-data]