# $Id: Coroutine.pir 38689 2009-05-11 17:22:23Z NotFound $

=head1 Coroutine Example

This example shows the usage of C<Stream::Coroutine>.

You can only write to the stream with yielding.

Stream::Sub has the advantage that the stream object can be passed to other
functions that in turn can write to the stream, which is not possible with
coroutine streams.

On the other hand, Stream::Coroutine is more lightweight than Stream::Sub.

=head1 FUNCTIONS

=over 4

=item _main

Creates a coroutine stream and dumps it.

=cut

.sub _main
    .local pmc stream
    .local pmc temp

    load_bytecode "Stream/Base.pbc"
    load_bytecode "Stream/Coroutine.pbc"

    # create the coroutine stream
    stream = new ['Stream'; 'Coroutine']

    # set the stream's source coroutine
    # A .Sub is a coroutine when there is a yield?
    .const 'Sub' temp = "_coro"
    assign stream, temp
    #stream."source"( temp )

    # dump the stream
    stream."dump"()

    end
.end

=item _coro

This sub is a coroutine that is used as the source of the stream.
It just writes the numbers 0 to 9 to the stream.

=cut

.sub _coro
    .param pmc stream
    .local int i
    .local string str

    i = 0
LOOP:
    str = i

    .yield(str)

    inc i
    if i < 10 goto LOOP

    # the stream is automatically closed if you return a null string
    # you can also close it explicitly with
    # stream."close"()
    # in which case it doesn't matter what you are returning.

    null str
    .return(str)
.end

=back

=head1 AUTHOR

Jens Rieks E<lt>parrot at jensbeimsurfen dot deE<gt> is the author
and maintainer.
Please send patches and suggestions to the Perl 6 Internals mailing list.

=head1 COPYRIGHT

Copyright (C) 2004-2009, Parrot Foundation.

=cut

# Local Variables:
#   mode: pir
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir:
