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.

Reply via email to