The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package ExampleHelpers;

use warnings;
use strict;

use IO::Handle;
use Term::ReadLine;

use Exporter;
use base 'Exporter';
our @EXPORT_OK = qw( update_time print_input initialize_completion );

STDOUT->autoflush(1);

my $CSI = "\x1b[";
print "${CSI}2J${CSI}3H";

# Helper to update an internal time register and print it as we go.
# This helps us know it's working asynchronously.

my $t = 0;

sub update_time {
    ++$t;
    print STDERR "\x1b7${CSI}1H$t s \x1b8";
}

# Helper to print input with the elapsed time it took to receive the
# input.  This also lets us know Term::ReadLine is working.  The time
# only updates if timers can fire while Term::ReadLine is waiting for
# input.

sub print_input {
    my ($input) = @_;
    print "Got input [$input] in $t second(s)\n";
}

# Set up completion for a Term::ReadLine object.
# Completion only works if Term::ReadLine can handle individual
# asynchronous keystrokes.

my @words = qw(
abase
abased
abasedly
abasedness
abasement
abaser
abash
abashed
abashedly
abashedness
abashless
abashlessly
);

sub initialize_completion {
    my ($term) = @_;

    $term->Attribs()->{completion_function} = sub {
        my ($word, $line, $pos) = @_;
        $word ||= "";
        grep /^$word/i, @words;
    };

    return $term;
}

1;