From de6fa83e96923dad99a56e97fdab8c5df63fdb01 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 23 Jan 2020 15:47:01 +0100 Subject: [PATCH] :tada: Add high level `schedule!` function to vertx.timers. --- backend/vendor/vertx/src/vertx/timers.clj | 41 +++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/backend/vendor/vertx/src/vertx/timers.clj b/backend/vendor/vertx/src/vertx/timers.clj index 84213c0f3..ed8098822 100644 --- a/backend/vendor/vertx/src/vertx/timers.clj +++ b/backend/vendor/vertx/src/vertx/timers.clj @@ -14,6 +14,8 @@ io.vertx.core.Vertx io.vertx.core.Handler)) +;; --- Low Level API + (defn schedule-once! [vsm ms f] (let [^Vertx system (vu/resolve-system vsm) @@ -33,3 +35,42 @@ java.lang.AutoCloseable (close [_] (.cancelTimer system timer-id))))) + +;; --- High Level API + +(s/def ::once boolean?) +(s/def ::repeat boolean?) +(s/def ::delay integer?) +(s/def ::fn (s/or :fn fn? :var var?)) + +(s/def ::schedule-opts + (s/keys :req [::fn ::delay] :opt [::once ::repeat])) + +(defn schedule! + "High level schedule function." + [vsm {:keys [::once ::repeat ::delay] :as opts}] + (s/assert ::schedule-opts opts) + + (when (and (not once) (not repeat)) + (throw (IllegalArgumentException. "you should specify `once` or `repeat` params"))) + + (let [system (vu/resolve-system vsm) + state (atom nil) + taskfn (fn wrapped-task [] + (-> (p/do! ((::fn opts) opts)) + (p/catch' (constantly nil)) ; explicitly ignore all errors + (p/then' (fn [_] ; the user needs to catch errors + (when repeat + (let [tid (schedule-once! vsm delay wrapped-task)] + (reset! state tid) + nil)))))) + tid (schedule-once! vsm delay taskfn)] + (reset! state tid) + (reify + java.lang.AutoCloseable + (close [this] + (locking this + (when-let [timer-id (deref state)] + (.cancelTimer system timer-id) + (reset! state nil))))))) +