On Tue, May 04, 2010 at 01:08:52PM +1000, Toby Corkindale wrote: > On 22/04/10 19:00, Peter Rabbitson wrote: > >Toby Corkindale wrote: > >>Hey all, > >>Wouldn't it be nice if the ResultSet iterators were a bit more advanced? > >> > >>I would love it if the iterator built into DBIx::Class supported some > >>more functional programming style methods. > >> > >>ie. So that I could do: > >> > >>$schema->resultset('Users')->search( > >> { first_name => 'Bob' } > >>)->foreach( > >> sub { email_user($_) } > >>); > >> > >>Or to "map" to get the results I want in one hit: > >> > >>my @uppercase_names = $schema->resultset('Users')->search( > >> { first_name => 'Bob' } > >>)->map( > >> sub { uc($_->last_name . $_->firstname) } > >>); > >> > >>Or do a more complex check, grep style, to filter the list: > >> > >>my @y_users = $schema->resultset('Users')->search( > >> { first_name => 'Bob' } > >>)->grep( > >> sub { return complex_check($_) } > >>); > >> > > > >The implicit iterators built into DBIC resultsets were a blatant design > >mistake, and therefore they will not be extended any longer (at least not > >in core). You are however welcome to discuss a design for a ResultSet > >component, or even contribute to the DBIx::Class::Helpers family of > >modules. > > Hi, > I attach a ResultSet Component that adds the features I was discussing. > > Would this be appropriate to release as a mini CPAN module or would you > like to incorporate it into something else?
I would like you to never release that, and erase all copies from your hard disk. As noted, they are a design mistake. One you are perpetuating. If you want to do something useful, write a resultset component that extracts the iterator work out into a separate object and proxies next, first and reset to a built-in iterator. Then you cold implement things like foreach as $self->iter->each(... or similar. Which would be far cleaner. > Also, I wondered at which point it is best to call $resultset->reset.. > At the start, or end, or both, of all the methods? Any design that requires ->reset to be called is perpetuating the same mistake as perl's each() builtin makes and should be taken out and shot. -- Matt S Trout - Shadowcat Systems - Perl consulting with a commit bit and a clue http://shadowcat.co.uk/blog/matt-s-trout/ http://twitter.com/shadowcat_mst/ Email me now on mst (at) shadowcat.co.uk and let's chat about how our Catalyst commercial support, training and consultancy packages could help your team. _______________________________________________ List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class IRC: irc.perl.org#dbix-class SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk