(ns rss-thread-watch.utils "Util functions" (:gen-class)) ;; ===== Macros ===== (defmacro nil?-else "Return x unless it's nil, the return y" [x y] `(let [result# ~x] (if (nil? result#) ~y result#))) (defmacro when-else "Evaluates [tst], if it's truthy value returns that value. If it's not, execute everything in [else] and return last expr." [tst & else] `(let [res# ~tst] (if res# res# (do ~@else)))) (defmacro ret= "compares two values using [=]. If the result is true returns the value, else the result of [=]. Usefull with if-else" [x y] `(let [x# ~x y# ~y result# ~(= x y)] (if result# ~x result#))) ;; ===== Generic functions ==== (defn indices ;; https://stackoverflow.com/questions/8641305/find-index-of-an-element-matching-a-predicate-in-clojure "Returns indexes of elements passing predicate" [pred coll] (keep-indexed #(when (pred %2) %1) coll)) (defn map-deep-merge-missing "Merges two maps but only keys missing from first map" [m1 m2] (into m1 (for [k (keys m2)] (let [val1 (get m1 k) val2 (get m2 k)] (if (and (map? val1) (map? val2)) {k (map-deep-merge-missing val1 val2)} {k (nil?-else val2 val1)})))))