Hey Jarrod, You're welcome! I'm glad to hear that's helpful. As far as using map or doseq; I'd use map if you want to use the results for further processing, if not, I'd use doseq. This is a guess, but it seems like you don't have any need for the results, you just want the side effects of updating the DB and storing the file, so I'd just use doseq. I hope that helps!
Shaun On Monday, February 10, 2014 7:15:05 PM UTC-7, Jarrod Swart wrote: > > Shaun, > > Thanks a lot for your response. > > This is a much nicer version of what I came up with. I have one question > remaining: would you (map) over a seq of db-entities or would you use > something else (doseq, for, etc). > > I typically use map/filter/reduce 99% of the time and I'm just wander if > (map api-call-pipeline! seq-of-db-entities) is idiomatic in this case. > > Best, > Jarrod > > On Monday, February 10, 2014 7:36:49 PM UTC-5, Shaun Parker wrote: >> >> Hey Jarrod, >> >> Whenever I find myself writing out steps, like you just did, I like to >> use a method described by Stuart Sierra, >> pipelines<http://stuartsierra.com/2012/05/16/syntactic-pipelines>. >> In your case, I'd write something like this: >> >> (defn make-api-call! >> [{:keys [db-entity] :as state}] >> (let [result (client/post "https://cool-api.com/entity" >> {:form-params {:x 42 :y (:id db-entity) ...}}) >> status (:status result)] >> (assoc state :api-result result >> :api-call-successful? (<= 200 status 299)))) >> >> (defn write-response! >> [{:keys [api-result] :as state}] >> (let [file ...] >> (spit file (:body api-result)) >> (assoc state :api-result-file file))) >> >> (defn update-db-entity! >> [{:keys [db-entity] :as state}] >> (let [updated-db-entity (...)] >> (assoc state :db-entity updated-db-entity))) >> >> (defn process-api-result! >> [{:keys [api-call-successful?] :as state}] >> (-> state >> (update-db-entity!) >> (cond-> >> api-call-successful? (write-response!)))) >> >> (defn api-call-pipeline! >> [db-entity] >> (-> {:db-entity db-entity} >> (make-api-call!) >> (process-api-result!) >> ;; do whatever you want with the state, for now return the entity >> and the result file >> (select-keys [:db-entity :api-result-file]))) >> >> >> In this example you'd just call api-call-pipeline! with the database >> entity. This lets you test each of these steps in isolation. Hope that >> helps! >> >> Shaun >> >> On Monday, February 10, 2014 3:07:22 PM UTC-7, Jarrod Swart wrote: >>> >>> I'm having a hard time coming up with a satisfactory way to implement >>> the following: >>> >>> >>> 1. Call an API with a map from the DB containing various endpoint >>> data like URL, etc. >>> 2. If the response has an HTTP 200, update the map-from-db and then >>> write response body to a file. >>> 3. If step 2 yields a HTTP > 2xx, update the map-from-db but do not >>> write file >>> >>> Because this is mostly imperative it feels "icky" in Clojure. I would >>> just call the api query function mapped across them all, but I am making >>> many API requests and writing many files. It seemed better to attempt them >>> one at a time. Is this wrong-headed? >>> >>> Suggestions? >>> >>> -- 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/groups/opt_out.