Meikel Brandmeyer wrote:
> Maybe you can do:
> 
> (reduce (fn [[sales upgrades demo :as v] data]
>            (cond
>              (is-sales? data)   [(conj sales data) upgrades demo]
>              (is-upgrade? data) [sales (conj upgrades data) demo]
>              (is-demo? data)    [sales upgrades (conj demo data)]
>              :else v))
>          [[] [] []] (get-idata))

Another variation:

(use 'clojure.contrib.seq-utils)

(defn record-type [data]
   (cond
     (is-sale? data) :sales
     (is-upgrade? data) :upgrades
     (is-demo? data) :demos))

(group-by record-type (filter record-type (get-idata)))

If the three output lists themselves are too large, I'd just explicitly 
sum your units with reduce:

(reduce
  (fn [counts data]
    (let [type (record-type data)]
      (assoc counts type (+ (units data)
                            (get counts type 0)))))
  {} (get-idata))

=> {:sales 1233, :upgrades 17, :demos 42, nil 30}

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to