Thank you very much. I had the feeling I should reduce over the tree-path, but was not able to come up with something good like you did.
Best Regards, Sven Am Dienstag, 24. März 2015 22:58:18 UTC+1 schrieb Francis Avila: > > 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.