diff --git a/src/metabase/util.clj b/src/metabase/util.clj index 5f02043788b749dd0f0410f3a26a8eef1aaad0ba..ee8119c5fe7e4223514714ab1494f381c085b044 100644 --- a/src/metabase/util.clj +++ b/src/metabase/util.clj @@ -149,3 +149,13 @@ false (boolean (re-matches #"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?" (clojure.string/lower-case v))))) + +(defn rpartial + "Like `partial`, but applies additional args *before* BOUND-ARGS. + Inspired by [`-rpartial` from dash.el](https://github.com/magnars/dash.el#-rpartial-fn-rest-args) + + ((partial - 5) 8) -> (- 5 8) -> -3 + ((rpartial - 5) 8) -> (- 8 5) -> 3" + [f & bound-args] + (fn [& args] + (apply f (concat args bound-args)))) diff --git a/test/metabase/test_util.clj b/test/metabase/test_util.clj index 331b5b165d1ce9058da47ec56356bb2aa462e9b9..b22b480878aacb842dc2b865c3d999dd6e83c66c 100644 --- a/test/metabase/test_util.clj +++ b/test/metabase/test_util.clj @@ -28,3 +28,12 @@ :a 100 :b (+ 100 (:a <>)) :c (+ 100 (:b <>)))) + + +;;; tests for RPARTIAL + +(expect 3 + ((rpartial - 5) 8)) + +(expect -7 + ((rpartial - 5 10) 8))