The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Copyright 2008, 2009, 2010 Kevin Ryde

# This file is part of PerlIO-via-EscStatus.
#
# PerlIO-via-EscStatus is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation; either version 3, or (at your option) any
# later version.
#
# PerlIO-via-EscStatus is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with PerlIO-via-EscStatus.  If not, see <http://www.gnu.org/licenses/>.


use strict;
use warnings;
use PerlIO::via::EscStatus qw(print_status);
use Term::Sk;
use Time::HiRes 'usleep';

binmode (STDOUT, ':via(EscStatus)')
  or die "Cannot push EscStatus layer: $!";

# $str is a Term::Sk get_line() string, return without its backspacing
sub undo_sk_backspaces {
  my ($str) = @_;
  $str =~ s/([\b]+) +\1//;
  return $str;
}

my $target = 500;
my $sk = Term::Sk->new ('%d %3c records, %5t elapsed, [%10b] %3p',
                        {base   => 0,
                         target => $target,
                         quiet   => 1})
  or die "Term::Sk error ${Term::Sk::errcode}: $Term::Sk::errmsg";

# initial status
print_status undo_sk_backspaces($sk->get_line);


my $step = 50;

$sk->up ($step);
if (my $status = $sk->get_line) { print_status undo_sk_backspaces($status); }
sleep 1;

$sk->whisper("whisper\n");
sleep 1;

print_status '';
print "blanked\n";

$sk->whisper("whisper over blank\n");
sleep 1;

$sk->up ($step);
if (my $status = $sk->get_line) { print_status undo_sk_backspaces($status); }
sleep 1;

print "plain print\n";
sleep 1;

$sk->up ($step);
if (my $status = $sk->get_line) { print_status undo_sk_backspaces($status); }

print_status '';
exit 0;