I'm sure this can be simplyfied: (defn mlg [attrs data] (if (empty? attrs) [ (reduce + (map :mv data)) {:children data}] (let [parts (group-by (first attrs) data) subtrees (map (fn [[value data]] [value (mlg (rest attrs) (map #(dissoc % (first attrs)) data))]) parts)] (reduce (fn [[sum tree] [value [sumsubtree subtree]]] [(+ sum sumsubtree) (update-in tree [:children] conj (assoc subtree :path [(first attrs) value] :mv sumsubtree))] ) [ 0.0 { :children [] }] subtrees))))
Returns a pair with the sum for all items and a tree. Each tree is represented as a dictionary, and inner nodes of the tree have three keys: - :mv the sum of :mv's of its children - :path a pair of attr-value that represents all the leaves in the subtree - :children the subtrees of this level Leaves are represented as dictionaries with only the keys :sec_id and :mv. Best regards, Juan Manuel -- 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