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))