#!/usr/bin/perl
use strict;
use warnings;
use AnyEvent;
use Coro;
use Coro::AnyEvent;
use Coro::Handle;
use Term::ReadLine 1.09;
use File::Basename;
use lib dirname($0) . '/lib';
use ExampleHelpers qw(
initialize_completion update_time print_input
);
async {
while (1)
{
# use a Coro-safe sleep.
Coro::AnyEvent::sleep 1;
update_time();
}
};
my $term = Term::ReadLine->new('...');
initialize_completion($term);
# set up the event loop callbacks.
$term->event_loop(
sub {
# This callback is called every time T::RL wants to
# read something from its input. The parameter is
# the return from the other callback.
# Tell Coro to wait until we have something to read,
# and then we can return.
shift->readable();
}, sub {
# This callback is called as the T::RL is starting up
# readline the first time. The parameter is the file
# handle that we need to monitor. The return value
# is used as input to the previous callback.
# in Coro, we just need to unblock the filehandle,
# and save the unblocked filehandle.
unblock $_[0];
}
);
my $input = $term->readline('> ');
# when we're completely done, we can do this. Note that this still does not
# allow us to create a second T::RL, so only do this when your process
# will not use T::RL ever again. Most of the time we shouldn't need this,
# though some event loops may require this. Reading AnyEvent::Impl::Tk
# seems to imply that not cleaning up may cause crashes, for example.
# (And Coro uses AnyEvent under the covers.)
$term->event_loop(undef);
# No further cleanup required other than letting the filehandle go out of scope
# and thus deregister.
print_input($input);