Notice that get-in-via is simply reduce: (defn get-in-via [m via ks] (reduce (fn [m' k] (via m' k)) m ks))
Same as: (defn get-in-via [m via ks] (reduce via m ks)) Same as: (reduce via m ks) So once you write your "step" function, traversal is taken care of by the reduction. On Tuesday, March 24, 2015 at 4:55:23 PM UTC-5, Francis Avila wrote: > > Separate out traversal from selection to make this clearer. > > We make a generic traversal function get-in-via. It accepts a via function > which takes the current result and some value which determines the next > result, and returns the next result. > > (defn get-in-via [m via ks] > (reduce (fn [m' k] (via m' k)) m ks)) > > > Here is a via function that follows folder paths. This is a single "step" > of the reduction. > > (defn via-folderpath [items foldername] > > (->> items > (filter #(and (= (:type %) :folder) > (= (:name %) foldername))) > (first) > :children)) > > > > Example of use: > > (get-in-via ffs via-folderpath ["sub2" "sub21"]) > > ;=> [{:name "lein-env", :type :file}] > > > > > On Tuesday, March 24, 2015 at 4:22:21 PM UTC-5, Sven Richter wrote: >> >> Hi, >> >> I wrote a function to trackdown a path in a vector containing nested maps: >> >> (defn get-files-from-folder-path [ffs folder-path] >> (filter #(= :file (:type %)) >> (loop [tree-path-position 0 acc [] fof ffs] >> (let [folder (first (filter #(and >> (= :folder (:type %)) >> (= (nth folder-path >> tree-path-position nil) (:name %))) fof))] >> (if (not (:children folder)) >> acc >> (recur (inc tree-path-position) >> (if (= (+ tree-path-position 1) (count folder-path)) >> (concat acc (:children folder)) acc) >> (:children folder))))))) >> >> And these are the inputs: >> (def ffs [{:type :folder, :name "sub1", :children [{:type :file, :name >> "datomic-data.edn"}]} >> {:type :folder, :name "sub2", :children [{:type :file, :name "foo >> (1).csv"} >> {:type :folder, :name >> "sub21", :children [{:type :file, :name "lein-env"}]}]}]) >> >> (def tree-path ["sub2" "sub21"]) >> >> And I call it like this: >> >> (get-files-from-folder-path ffs tree-path) >> >> Is there a way to use reduce for that? I was stuck because I think I have to >> reduce on two lists here, >> but reduce only takes one to start with, thats why I chose the loop / recur >> route. Which works >> but it looks ugly to me and I am afraid in one week I want understand it >> anymore. >> >> Thanks Regards, >> Sven >> >> >> >> -- 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.