Carmel
view release on metacpan or search on metacpan
lib/Carmel/ProgressBar.pm view on Meta::CPAN
package Carmel::ProgressBar;
use strict;
use warnings;
use Class::Tiny qw( quiet width total _prev );
use POSIX qw(ceil);
use parent qw(Exporter);
our @EXPORT = qw(progress);
sub progress {
my($args, $code) = @_;
return unless @$args;
my $class = __PACKAGE__;
my $self = $class->new(
width => 50,
total => scalar(@$args),
quiet => !-t STDOUT,
);
local $| = 1
unless $self->quiet;
$self->update(0);
for my $i (0..$#$args) {
$code->($args->[$i]);
$self->update($i+1);
}
$self->clear;
}
sub update {
my($self, $count) = @_;
return if $self->quiet;
my $width = $self->width;
my $pct = int(100 * $count / $self->total);
my $done = ceil($pct * $width / 100);
my $head = $width == $done ? 0 : 1;
my $remain = ($width - $done - $head);
my $line = sprintf "[%s%s%s] %3d%%",
("=" x $done), (">" x $head), (" " x $remain), $pct;
return if $self->_prev && $line eq $self->_prev;
print "\r", $line;
$self->_prev($line);
return;
}
sub clear {
my $self = shift;
print "\r", " " x ($self->width + 7), "\r";
}
1;
( run in 2.109 seconds using v1.01-cache-2.11-cpan-5735350b133 )