Workaround for upstream issue https://github.com/camsaul/methodical/issues/97 Actually a bit of a misnomer since this does still sort dispatch values; it just doesn't complain if any are ambiguous. | (ns metabase.util.methodical.unsorted-dispatcher (:require [methodical.impl.dispatcher.standard] [methodical.interface]) (:import (methodical.interface Dispatcher))) |
(set! *warn-on-reflection* true) | |
(comment methodical.interface/keep-me) | |
(deftype UnsortedDispatcher [dispatch-fn hierarchy-var default-value]
Dispatcher
(dispatch-value [_] (dispatch-fn))
(dispatch-value [_ a] (dispatch-fn a))
(dispatch-value [_ a b] (dispatch-fn a b))
(dispatch-value [_ a b c] (dispatch-fn a b c))
(dispatch-value [_ a b c d] (dispatch-fn a b c d))
(dispatch-value [_ a b c d more] (apply dispatch-fn a b c d more))
(matching-primary-methods [_this method-table dispatch-value]
(methodical.impl.dispatcher.standard/matching-primary-methods
{:hierarchy (deref hierarchy-var)
:default-value default-value
:method-table method-table
:dispatch-value dispatch-value
:ambiguous-fn (constantly false)}))
(matching-aux-methods [_this method-table dispatch-value]
(methodical.impl.dispatcher.standard/matching-aux-methods
{:hierarchy (deref hierarchy-var)
:default-value default-value
:method-table method-table
:dispatch-value dispatch-value
:ambiguous-fn (constantly false)}))
(default-dispatch-value [_this]
default-value)
(prefers [_]
nil)
(with-prefers [this new-prefs]
(when (seq new-prefs)
(throw (UnsupportedOperationException. (format "%s does not support preferences." `unsupported-dispatcher))))
this)
(dominates? [_this _x _y]
false)) | |
This is basically similar the same as the [[methodical.core/standard-dispatcher]], but doesn't complain when dispatch values are ambiguous, and doesn't support preferences. | (defn unsorted-dispatcher
[dispatch-fn & {:keys [hierarchy default-value]
:or {hierarchy #'clojure.core/global-hierarchy
default-value :default}}]
{:pre [(ifn? dispatch-fn) (instance? clojure.lang.IDeref hierarchy)]}
(->UnsortedDispatcher dispatch-fn hierarchy default-value)) |