From a35cacae67c50802e5c5c22cbea9d1389fd7e26f Mon Sep 17 00:00:00 2001 From: Nathan Marz Date: Wed, 17 Aug 2016 09:42:59 -0400 Subject: [PATCH] have defnav generate every method as a helper function as well (with name -, takes params as initial arguments followed by regular method arguments (except for 'this') --- src/clj/com/rpl/specter/macros.clj | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/clj/com/rpl/specter/macros.clj b/src/clj/com/rpl/specter/macros.clj index 35327e3..d4530b4 100644 --- a/src/clj/com/rpl/specter/macros.clj +++ b/src/clj/com/rpl/specter/macros.clj @@ -255,9 +255,19 @@ (let [afn# (fn [~structure-sym] ~@impl)] (i/filter-transform afn# structure# next-fn#))))) +(defn- helper-name [name method-name] + (symbol (str name "-" method-name))) -(defmacro defnav [name & body] - `(def ~name (nav ~@body))) +(defmacro defnav [name params & impls] + ;; remove the "this" param for the helper + (let [helpers (for [[mname [_ & mparams] & mbody] impls] + `(defn ~(helper-name name mname) [~@params ~@mparams] ~@mbody)) + decls (for [[mname & _] impls] + `(declare ~(helper-name name mname)))] + `(do + ~@decls + ~@helpers + (def ~name (nav ~params ~@impls))))) (defmacro defcollector [name & body] `(def ~name (collector ~@body)))