Using extend-protocol
, a protocol P
can provide a default implementation for anything that implements interface I
. This essentially teaches I
's to do new things. If we want a type or record to provide the functionality of I
we still need to extend them with I
.
Is there a way to specify I
behavior (it's methods) in terms of P
's behavior?
What am I actually trying to accomplish
My protocol P
(which is like a stream) has (seq [this] [this timeout-value])
to provide sequence access. The second arity is to return a special value if the stream expired. (Ending the sequence there would be confusing.)
P
also has (close [this])
.
I would like objects that extend P
to be usable in clojure.core/seq
(being a Sequable
) and also implement java.io.Closeable
. One way to accomplish this is to remove those methods from P
and just implement Sequable
& Closeable
within the type/record. But then when somebody hands me a P
can't be sure if it can be closed or seq
ed. Call me object oriented, but P extends I
.
Looking for
- It's not possible (for now).
- It can be done with this code ...
- It can be redesigned to achieve a similar effect ...
If P
's seq
being multiple arity is an issue, seq
& seq'
would do as well.