Add some simple examples for multimethods
This commit is contained in:
parent
9c115996f9
commit
eb73f39c9e
2 changed files with 49 additions and 0 deletions
|
|
@ -280,4 +280,9 @@
|
|||
[2 4]
|
||||
[2 4]
|
||||
6]}]
|
||||
|
||||
["27_multimethods" {"__" ["Hello, World!"
|
||||
"Hello there"
|
||||
1
|
||||
6]}]
|
||||
]
|
||||
|
|
|
|||
44
src/koans/27_multimethods.clj
Normal file
44
src/koans/27_multimethods.clj
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
(ns koans.27-multimethods
|
||||
(:require [koan-engine.core :refer :all]))
|
||||
|
||||
(defmulti multimethod-without-args
|
||||
(fn [keyword-arg] keyword-arg))
|
||||
|
||||
(defmethod multimethod-without-args :first [_]
|
||||
(str "Hello, World!"))
|
||||
|
||||
(defmethod multimethod-without-args :second [_]
|
||||
(str "Hello there"))
|
||||
|
||||
(defmulti multimethod-with-args
|
||||
(fn [opt-one opt-two] opt-one))
|
||||
|
||||
(defmethod multimethod-with-args :path-one [_ opts]
|
||||
(:first-opt opts))
|
||||
|
||||
(defmethod multimethod-with-args :path-two [_ opts]
|
||||
(let [numbers (:second-opt opts)]
|
||||
(->> numbers
|
||||
(map inc)
|
||||
(reduce +))))
|
||||
|
||||
(defmethod multimethod-with-args :path-three [_])
|
||||
|
||||
(meditations
|
||||
"A multimethod takes an one or more arguments to dispatch on"
|
||||
(= __
|
||||
(multimethod-without-args :first))
|
||||
|
||||
"Though it can be ignored and represented by _ in defmethods"
|
||||
(= __
|
||||
(multimethod-without-args :second))
|
||||
|
||||
"Alternatively, we can use the arguments in defmethods"
|
||||
(= __
|
||||
(multimethod-with-args :path-one {:first-opt 1
|
||||
:second-opt 2}))
|
||||
|
||||
"This allows us to something different in each method implementation"
|
||||
(= __
|
||||
(multimethod-with-args :path-two {:first-opt 1
|
||||
:second-opt [0 1 2]})))
|
||||
Loading…
Reference in a new issue