Acme-ProgressBar
view release on metacpan or search on metacpan
lib/Acme/ProgressBar.pm view on Meta::CPAN
use strict;
use warnings;
package Acme::ProgressBar 1.130;
# ABSTRACT: a simple progress bar for the patient
use Time::HiRes ();
#pod =head1 SYNOPSIS
#pod
#pod use Acme::ProgressBar;
#pod progress { do_something_slow };
#pod
#pod =cut
use base qw(Exporter);
our @EXPORT = qw(progress); ## no critic Export
#pod =head1 DESCRIPTION
#pod
#pod Acme::ProgressBar provides a simple solution designed to provide accurate
#pod countdowns. No progress bar object needs to be created, and all the
#pod calculation of progress through total time required is handled by the module
#pod itself.
#pod
#pod =func progress
#pod
#pod progress { unlink $_ for <*> };
#pod progress { while (<>) { $ua->get($_) } };
#pod progress { sleep 5; }
#pod
#pod There is only one function exported by default, C<progress>. This function
#pod takes a coderef as its lone argument. It will execute this code and display a
#pod simple progress bar indicating the time required for ten iterations through the
#pod code.
#pod
#pod =cut
sub progress(&) { ## no critic Prototype
my ($code) = @_;
local $| = 1; ## no critic
_overprint(_message(0,10,undef));
my $begun = Time::HiRes::time;
$code->();
my $total = Time::HiRes::time - $begun;
for (1 .. 9) {
_overprint(_message($_,10,$total));
Time::HiRes::sleep($total);
}
_overprint(_message(10,10,$total));
print "\n";
}
sub _message {
my ($iteration, $total, $time) = @_;
my $message = 'Progress: ['
. q{=} x $iteration
. q{ } x ($total - $iteration)
. '] ';
if (defined $time) {
$message .= sprintf '%0.0fs remaining%25s',
(($total - $iteration) * $time), q{ };
} else {
$message .= '(calculating time remaining)';
}
}
sub _overprint {
my ($message) = @_;
print $message, "\r";
}
#pod =head1 TODO
#pod
#pod =for :list
#pod * allow other divisions of time (other than ten)
#pod
#pod =head1 SEE ALSO
#pod
#pod L<Term::ProgressBar>, L<Term::ProgressBar::Simple>,
#pod L<Progress::Any::Output::TermProgressBarColor>, L<Smart::Comments>
#pod
#pod =cut
"48102931829 minutes remaining";
__END__
=pod
=encoding UTF-8
=head1 NAME
Acme::ProgressBar - a simple progress bar for the patient
=head1 VERSION
( run in 1.284 second using v1.01-cache-2.11-cpan-d80b1682f3f )