That pattern will be a great addition to the toolbox, thank you :) On Sep 16, 9:58 am, Laurent PETIT <laurent.pe...@gmail.com> wrote: > And note that the pattern works at any level, and is easily readable, since > update-in "flattens" the arguments of the modifying function : > > If you want to "touch" the path [:a :b :c :d] and provide specific default > values at each level if the key is not found, it's as "simple" as : > > (update-in coll > [:a] (fnil update-in default-for-first-level) > [:b] (fnil update-in default-for-second-level) > [:c] (fnil update-in default-for-third-level) > [:d] (fnil update-in default-for-fourth-level) > the-function-you-wanted-to-use-in-the-first-place > arg2-for-the-function > arg3-for-the-function ...) > > 2010/9/16 Laurent PETIT <laurent.pe...@gmail.com> > > > > > So nested calls to update-in are needed in order to be able to provide a > > specific default value, everytime just having an empty map created isn't > > sufficient. > > > So instead of (update-in {} [:a :b] identity) which returns {:a {:b nil}} , > > you can break the key path at :a so that the default value if no :a is > > specified by (fnil XXX default-value). And by specifying that XXX is > > update-in, you can continue your "key path" where you stopped (after :a), > > either using the found value at :a, either the provided default value : > > > (update-in {} [:a] (fnil update-in {:label "great label"}) [:b] identity) > > => {:a {:b nil, :label "great label"}} > > > or you can also decide that it's not a map which should be the default > > value, imagine you want to modify a path [:a 2] : > > > (update-in {} [:a] (fnil update-in [:foo :bar :baz]) [2] str) => {:a [:foo > > :bar ":baz"]} > > > 2010/9/16 Btsai <benny.t...@gmail.com> > > > My poor brain can't handle nested calls to update-in, so this is what > >> I came up with: > > >> (defn add-meetings [data k meetings] > >> (cond > >> (nil? (data k)) (assoc data k {:title "title" :meetings meetings}) > >> :else (update-in data [k :meetings] concat meetings))) > > >> On Sep 16, 8:53 am, Laurent PETIT <laurent.pe...@gmail.com> wrote: > >> > 2010/9/16 Meikel Brandmeyer <m...@kotka.de> > > >> > > Hi Laurent, > > >> > > On 16 Sep., 15:54, Laurent PETIT <laurent.pe...@gmail.com> wrote: > > >> > > > you don't like my one-liner ? :-) > > >> > > I saw your message only after I sent mine. :) > > >> > > > (update-in coll [k] (fnil update-in *default-value*) [:meetings] > >> (comp > >> > > vec > >> > > > concat) data) > > >> > > Hmm... (comp vec concat) == into? > > >> > Yep. > >> > so this is the killer one : :-) > > >> > (update-in coll [k] (fnil update-in *default-value*) [:meetings] into > >> data) > > >> -- > >> 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<clojure%2bunsubscr...@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 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