#!/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);