>
>
> (def Recipient
>>   (s/either PlaceHolder
>>             Existing
>>             OneOff))
>>
>
> This looks interesting. Where would I actually use this? I mean, if I have 
> created three records, I may as well implement multi methods or protocols, 
> right? Even if I don't do those, I will still need to use `(condp instance? 
> obj ...)` or equivalent to select the appropriate branch for processing. Is 
> there a way I can use Recipient to select a branch? 
>

I probably wouldn't use protocols since I doubt there is a function 
signature that is exactly identical for all branches. Each branch probably 
needs access to different parts of your system (eg. database) and always 
passing everything to everything is not ideal.

Multi-Method is great if you want something openly extensible but that 
again seems unlikely here and also assumes that everything requires the 
same arguments.

cond(p) sounds perfect for this case. I tend to write each branch as a 
single function and keep the dispatch as compact as possible.

(defn send-placeholder [thing {:keys [text]}]
  ...)

(defn send-existing [db thing {:keys [contact-id]}]
  ...)

(defn send-one-off [something thing {:keys [name email]}]
  ...)

(defn send [app thing recipient]
  (condp instance? recipient
    PlaceHolder
    (send-placeholder thing recipient)
    Existing
    (send-existing (:db app) thing recipient)
    OneOff
    (send-one-off (:something app) thing recipient)))


That greatly reduces the cognitive load when looking at each separate 
implementation and also keeps the actual internal structure of the 
Recipient out of the dispatch. The conpd does not need to know how many 
fields are in OneOff, the tuple/vector/variant match versions must know 
that. 

/thomas






-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to