Yeah, that's what I thought. I guess I'm using it in a way that's not standard practice. Luckily it's not a bottleneck in my case.
Has there been discussion about a "shortable" version of s/keys which just checks for key existence and doesn't recursively validate the corresponding values? I suppose if performance were an issue assuming the same requirements, I'm guessing some minimal work key-checking algorithm exists that I could write. For now, clojure.spec is convenient. On Wednesday, September 13, 2017 at 4:55:44 PM UTC-4, Alex Miller wrote: > > Seems pretty slow to dispatch on a linear series of spec validations, but > I don't see any reason it wouldn't work. > > On Wednesday, September 13, 2017 at 3:47:40 PM UTC-5, Brent Millare wrote: >> >> The example for multi-spec provided in the spec guide assumes a key that >> denotes a "type". (This key is used as the dispatch fn). In my situation, >> I'm assuming I don't have control over what maps are generated. In other >> words, I explicitly do not want to have to encode types into the input map. >> Instead, I want to rely on the "shape" (key set), since that is the most >> flexible. While I could create a dispatch function that analyzes the input >> and produces a "type", that offers no advantages over what I presented >> earlier. Adding more cases is not extensible since it requires redefining >> the dispatch fn. In other words, I'd be just copying pasting my presented >> function as the dispatch fn. >> >> Alex, did I address your point? Is the approach you are suggesting >> different? >> >> Alternatively, my previous example might have been misleading since I >> used keys to represent useful work. Perhaps it would have been better >> written as: >> >> (fn [m] >> (condp clojure.spec.alpha/valid? m >> ::foo-map-spec ... do foo stuff ... >> ::bar-map-spec ... do bar stuff ...)) >> >> On Wednesday, September 13, 2017 at 3:46:43 PM UTC-4, Alex Miller wrote: >> >>> You might want to look at s/multi-spec which lets you create a variable >>> open spec based on a multimethod, which would in this case be based on key >>> availability. >>> >>> >>> On Wednesday, September 13, 2017 at 11:54:31 AM UTC-5, Brent Millare >>> wrote: >>>> >>>> I have several maps with different combinations of keys for each map. I >>>> want to process each map but do different work depending on the set of >>>> keys >>>> available, basically dispatch on key availability. I thought clojure.spec >>>> might be a good fit for doing the classification step. So for each key, I >>>> could define a spec. Next, I would use clojure.spec.alpha/keys to define a >>>> spec for each set of keys I'd like to match. Finally, I would dispatch >>>> like >>>> so: >>>> >>>> (fn [m] >>>> (condp clojure.spec.alpha/valid? m >>>> ::foo-map-spec :do-foo-stuff >>>> ::bar-map-spec :do-bar-stuff)) >>>> >>>> Does this seem reasonable? >>>> >>>> The advantage in my mind is its thorough, explicit, and easy to read. >>>> Possible downsides is performance if it mattered. >>>> >>>> What are the advantages/disadvantages to this approach compared to >>>> other methods? >>>> >>> -- 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.