2024-01-05 01:45:41 +01:00
|
|
|
(ns rss-thread-watch.utils
|
|
|
|
"Util functions"
|
|
|
|
(:gen-class))
|
2024-01-05 14:30:27 +01:00
|
|
|
|
2024-01-05 01:45:41 +01:00
|
|
|
;; ===== 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
|
2024-01-05 14:14:47 +01:00
|
|
|
"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))))
|
|
|
|
|
2024-01-05 01:45:41 +01:00
|
|
|
(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#)))
|
2024-01-06 05:54:50 +01:00
|
|
|
|
|
|
|
;; ===== 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)})))))
|