Last active
August 10, 2021 14:26
-
-
Save not-in-stock/e0613848f7938444f756b4064cfeae77 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns not-in-stock.macro.events | |
(:require [clojure.spec.alpha :as s] | |
[medley.core :as medley] | |
[re-frame.core :as re-frame])) | |
(defn- prepend-if-absent [xs x] | |
(cond->> xs | |
(nil? (medley/find-first #(= x %) xs)) (into [x]))) | |
(defn- default-reg-event [reg-event-fn] | |
(fn inner-reg-event | |
([id handler] | |
(inner-reg-event id nil handler)) | |
([id interceptors handler] | |
(reg-event-fn id (prepend-if-absent interceptors re-frame/trim-v) handler)))) | |
(def trimmed-reg-event-db | |
(default-reg-event re-frame/reg-event-db)) | |
(def trimmed-reg-event-fx | |
(default-reg-event re-frame/reg-event-fx)) | |
(defn- defevent-helper [event-register-fn event-name bindings & interceptors+handler] | |
(let [event-kw (keyword (str *ns*) (name event-name)) | |
input-sym (gensym "input__") | |
handler (last interceptors+handler) | |
interceptors (first (butlast interceptors+handler))] | |
(with-meta | |
`(do | |
(~event-register-fn | |
~event-kw | |
~@(when (some? interceptors) | |
[interceptors]) | |
(fn [~input-sym ~bindings] | |
(~handler ~input-sym))) | |
(defn ~event-name ~bindings | |
[~event-kw ~@bindings])) | |
{:input-sym input-sym}))) | |
(defmacro defevent-db [event-name bindings & interceptors+handler] | |
(apply defevent-helper `trimmed-reg-event-db event-name bindings interceptors+handler)) | |
(defmacro defevent-fx [event-name bindings & interceptors+handler] | |
(apply defevent-helper `trimmed-reg-event-fx event-name bindings interceptors+handler)) | |
(def defevent-args-spec | |
(s/cat :name simple-symbol? | |
:bindings (s/coll-of simple-symbol? :kind vector?) | |
:interceptors (s/? any?) | |
:handler any?)) | |
(s/fdef defevent-db | |
:args defevent-args-spec) | |
(s/fdef defevent-fx | |
:args defevent-args-spec) |
Author
not-in-stock
commented
Jul 15, 2020
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment