* On Tue, May 11 2010, Klaus wrote:
> However, unlike XML::Twig, XML::Reader does not rely on callback
> functions to parse the XML. With XML::Reader you loop over the
> XML-document yourself and the resulting XML-elements (and/or
> XML-subtrees) are represented in text format. This style of processing
> XML is similar to the classic pattern:
>
> "open my $fh, '<', 'file.txt'; while (<$fh>) { do_sth($_); } close $fh;"

FWIW, it's very easy to make callback-based code look like an iterator.
Here's an example script.

  use strict;
  use warnings;
  use feature ':5.10';

  use Coro;
  use Coro::Handle;
  use Coro::Channel;

Imagine you have a routine that calls a callback for each event, like
receiving a line from a filehandle:

  sub call_on_line(&){
      my $cb = shift;
      async {
          my $fh = unblock \*STDIN;
          while(my $line = $fh->readline){
              chomp $line;
              $cb->($line);
          }
      };
  }

(Ignore the implementation here, it's just an example.)

You can "loop over" the results of the callback, like this:

  my $chan = Coro::Channel->new;

  call_on_line { $chan->put(@_) };

  async {
      while(my $item = $chan->get) {
          say "GOT ITEM: $item";
      }
  }->join;

So I'm not sure there's a point in writing a module just to be
loop-driven instead of callback-driven; it's easy to convert
callback-based code to "blocking" code.

When in doubt, if you are trying to write something reusable, make it
callback-driven instead of blocking.  Then the consumer can easily
choose how to use it.

Regards,
Jonathan Rockway

--
print just => another => perl => hacker => if $,=$"

Reply via email to