3

I have a method called "visualize" in my Clojure application which can supposedly render any part of my application. The problem I have is that some things in my application are Java classes and some are hashmaps, with fields internally marking the type of the map using the clojure :: idiom. I know I can use multimaps to dispatch on type or on some internal type, but how can I do it so that the same multimethod works on BOTH.

Alex Miller
  • 69,183
  • 25
  • 122
  • 167
yazz.com
  • 57,320
  • 66
  • 234
  • 385

1 Answers1

5

Create a dispatch function that both looks for maps with a special marker type and for Java classes.

(defn visualize-dispatch [foo]
  (if (map? foo) 
    (:type foo)
    (class foo)))

(defmulti visualize visualize-dispatch)

(defmethod visualize String [s] 
  (println "Got a string" s))

(defmethod visualize :banana [b] 
  (println "Got a banana that is" (:val b)))

Then you can call visualize with either one of your Java classes or a map like {:type :banana :val "something"}.

user> (visualize "bikini")
Got a string bikini
user> (visualize {:type :banana :val "speckled"})
Got a banana that is speckled
Alex Miller
  • 69,183
  • 25
  • 122
  • 167