Sunday, November 8, 2020

Multi-Arity Multi-Methods

Q: Is it possible to overload Clojure multi-methods on arity?
A: Yes. Below a code example

(def u1 {:name "bob"  :company "Facebook" :salary 100000})
(def u2 {:name "jane" :company "Google"   :salary 150000})
(def u3 {:name "mike" :company "Other"    :salary 160000})

(defmulti tm (fn [user & etc] (:company user)))

(defmethod tm "Google"   [user] "Google user")
(defmethod tm "Facebook" [user] "Facebook user")

(defmethod tm "Other"
  ([user]             "Other user with one argument")
  ([user y]           "Other user with two argument")
  ([user y & etc] "Other user with many arguments"))

;; (tm u1)
;; "Facebook user"

;; (tm u2)
;; "Google user"

;; (tm u3)
;; "Other user with one argument"

;; (tm u3 1)
;; "Other user with two argument"

;; (tm u3 1 3)
;; "Other user with many arguments"

No comments:

Post a Comment