From df4fef27fb0bd64ba64ca5a08302c6eafc6cbdfb Mon Sep 17 00:00:00 2001 From: eltrac Date: Tue, 17 Mar 2026 11:46:45 +0800 Subject: perf(storage): get/delete webmention lazily also done some refactoring and DRY --- src/weepinbell/storage.clj | 51 +++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 21 deletions(-) (limited to 'src') 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] -- cgit v1.2.3