OK, all submitted. The tickets are up for discussion at

http://www.assembla.com/spaces/clojure/support/tickets/400-a-faster-flatten
http://www.assembla.com/spaces/clojure/support/tickets/401-promote--seqable---from-contrib-

I will mail my CA in tomorrow morning.

Thanks Stu and Mark!

On Jul 13, 11:57 am, Stuart Halloway <stuart.hallo...@gmail.com>
wrote:
> Hi Cam,
>
> Please submit the modified version, and, if you want, create a separate 
> ticket for "seqable?". I would like to review the latter separately.
>
> Stu
>
>
>
> > Hi again, I modified my-flatten to return the empty list for sets and
> > maps as core/flatten does. It doesn't seem to handle Arrays anymore
> > though. I'm assuming it's because ArrayList and (int-array ...) don't
> > implement Sequential. None the less should I still submit this
> > modified version that behaves just like core/flatten?
>
> > (defn my-flatten
> >  [coll]
> >  (lazy-seq
> >    (when-let [coll (if (sequential? coll) (seq coll))]
> >      (let [x (first coll)]
> >        (if (sequential? x)
> >          (concat (my-flatten x) (my-flatten (next coll)))
> >          (cons x (my-flatten (next coll))))))))
>
> > Might it be worth promoting "seqable?" to core? In that case flatten
> > would handle pretty much everything you could throw at it like you'd
> > expect. I don't speak for everyone but when I saw sequential? I
> > assumed it would have the semantics that seqable? does.
>
> > On Jul 13, 11:04 am, Cam <dlocpuw...@gmail.com> wrote:
> >> Hi Stuart,
>
> >> Thanks for checking that out for me! Sorry for not realizing in the
> >> first place.
>
> >> I of course would be happy to submit a patch. Should I submit that
> >> here or over on the assembla page?
>
> >> On Jul 13, 9:10 am, Stuart Halloway <stuart.hallo...@gmail.com> wrote:
>
> >>> Hi Cam,
>
> >>> Your tests aren't testing the interesting part without a doall.
>
> >>> That said, my quick tests with doall show your approach faring even 
> >>> better. :-) Also, I think what my-flatten does with Java arrays is 
> >>> intuitive (and the current flatten not so much).
>
> >>> A patch that preserves the semantics of the existing flatten (except for 
> >>> working with Java arrays) would be welcome.
>
> >>> Thanks!
> >>> Stu
>
> >>>> Another flatten thread! Sorry..
>
> >>>> Hello all, before I realized there was a flatten in the master branch
> >>>> (and before I looked at contrib) I wrote this pretty standard code:
>
> >>>> (defn my-flatten [coll]
> >>>> (lazy-seq
> >>>>   (when-let [coll (seq coll)]
> >>>>     (let [x (first coll)]
> >>>>       (if (sequential? x)
> >>>>         (concat (my-flatten x) (my-flatten (next coll)))
> >>>>         (cons x (my-flatten (next coll))))))))
>
> >>>> (There's very similar versions on the boards. I'm not claiming this is
> >>>> anything amazing or unique.)
>
> >>>> It's not as elegant as what's in core, but in my micro benchmarks (ran
> >>>> on my laptop; 2.26 core 2 and 4gb ram) it seems to perform a bit
> >>>> better, _especially_ in the already flattened case. It behaves just
> >>>> like core/flatten except that it doesn't return an empty list when
> >>>> passed a map or set, it just returns whatever you gave it but with the
> >>>> top level converted to a seq. I'm pretty much a clojure noob, so are
> >>>> there any hidden detractors of this implementation as opposed to the
> >>>> version introduced in 1.2?
>
> >>>> Also, quick note, if you swap the call to sequential? with seqable?
> >>>> from contrib/core, it flattens maps and sets like you'd expect as
> >>>> well.
> >>>> Here is how it looks
> >>>> user=> (my-flatten #{1 {2 3} 4 [5 6 7 #{8 {9 10}}]})
> >>>> (1 2 3 4 5 6 7 9 10 8)
>
> >>>> And for the micro-benchmarks (using "sequential?"):
>
> >>>> user=> (time (dotimes [_ 1e7] (flatten [1 2 3 4])))
> >>>> "Elapsed time: 14,661.592 msecs"
> >>>> nil
>
> >>>> user=> (time (dotimes [_ 1e7] (my-flatten [1 2 3 4])))
> >>>> "Elapsed time: 922.268 msecs"
> >>>> nil
>
> >>>> user=> (time (dotimes [_ 1e7] (flatten [1 [2 [3 [4 [5 [6 [7 [8]
> >>>> [[[9]]] 10 [11] 12 [13 14 [15]]]]]]]]])))
> >>>> "Elapsed time: 18,147.959 msecs"
> >>>> nil
>
> >>>> user=> (time (dotimes [_ 1e7] (my-flatten [1 [2 [3 [4 [5 [6 [7 [8]
> >>>> [[[9]]] 10 [11] 12 [13 14 [15]]]]]]]]])))
> >>>> "Elapsed time: 6,088.914 msecs"
> >>>> nil
>
> >>>> user=> (time (dotimes [_ 1e7] (flatten [[1 2 3 4 5 6 7 8 9 10]])))
> >>>> "Elapsed time: 11,696.693 msecs"
> >>>> nil
>
> >>>> user=> (time (dotimes [_ 1e7] (my-flatten [[1 2 3 4 5 6 7 8 9 10]])))
> >>>> "Elapsed time: 1,533.983 msecs"
> >>>> nil
>
> >>>> Thoughts?
>
> >>>> --
> >>>> 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 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 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

Reply via email to