A Clojure library which provides the internals of Clojure's multimethods as a persistent, immutible map implementation.
Also includes an implementation of the multimethod macros and functions in terms of a dispatch-map and an atom.
(require '[dispatch-map.core :refer (dispatch-map)]) (derive ::rect ::shape) (let [m (-> (dispatch-map identity [::rect ::shape] :rect-shape [::shape ::rect] :shape-rect) (prefer [::rect ::shape] [::shape ::rect]))] (println (m [::rect ::rect])) (println (m [::shape ::rect])) (println (m [::rect ::circle] :not-found)))
:rect-shape :shape-rect :not-found
Java's type hierarchy gets special treatment in Clojure's native multimethods via the
You can now get similarly special treatment by implementing the
-isa method on the
This is useful if you have a hiearchy defined by some other means that you don't wish to manually reproduce by successive calls to
See the tests for an example.
Note that your
-isa method must produce a result that is safe to memoize.
This is how you use the custom multimethod implementation. The only compelling reason to prefer this over Clojure's native MultiFn or a raw dispatch-map is if you need to provide a custom IHierarchy implementation.
(ns your-ns (:refer-clojure :exclude [defmulti defmethod remove-all-methods remove-method prefer-method methods get-method prefers]) (:use [dispatch-map.multi-fn])))
Copyright © 2012 Brandon Bloom
Distributed under the Eclipse Public License, the same as Clojure.