extended-extend-protocol.core
A single Clojure macro for streamlined protocol extension.
multi-extend-protocol
macro
(multi-extend-protocol protocol & types+methods)A version of clojure.core/extend-protocol with (possibly) more conciseness.
Extends protocols to multiple types which share identical implementations. A series of names appearing before an implementation of the protocol expands into repeated implementations for each individual type.
Recommended: Supply class/type names as symbols or nil; expressions intended to be evaluated will convey the inconsistent behavior of the underlying clojure.core/extend-protocol.
Note: No additional checking is performed to ensure that the protocol’s implementation is valid.
Example:
(multi-extend-protocol AProtocol
AType
BType
AClass
(foo [x] x)
(bar [y] y)
(baz [z] z)
DType
EClass
(foo [x] (inc x))
(bar [y] (dec y))
(baz [z] (identity z))
FType
nil
(foo [_] 99)
(bar [_] 42)
(baz [_] 0))
…expands to…
(clojure.core/extend-protocol AProtocol
AType
(foo [x] x)
(bar [y] y)
(baz [z] z)
BType
(foo [x] x)
(bar [y] y)
(baz [z] z)
AClass
(foo [x] x)
(bar [y] y)
(baz [z] z)
DType
(foo [x] (inc x))
(bar [y] (dec y))
(baz [z] (identity z))
EClass
(foo [x] (inc x))
(bar [y] (dec y))
(baz [z] (identity z))
FType
(foo [_] 99)
(bar [_] 42)
(baz [_] 0)
nil
(foo [_] 99)
(bar [_] 42)
(baz [_] 0))