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

use strict;
use warnings;
use blib;
use Term::Spinner;
use Term::MultiSpinner;

print STDERR "Single: ";
{
    my $spinner = Term::Spinner->new( clear_on_destruct => 0 );
    for my $i (1..30) {
        $spinner->advance();
        select(undef, undef, undef, 0.1);
    }
}
print STDERR "\n";
sleep(1);

print STDERR "Factor of Ten: ";

{
    my $spinner = Term::MultiSpinner->new( clear_on_destruct => 0 );

    for my $i (1..50) {
        $spinner->advance(1);
        $spinner->advance(0) if not $i % 10;
        select(undef, undef, undef, 0.1);
    }
}
print STDERR "\n";
sleep(1);

print STDERR "Rolling Finish: ";
{
    my $spinner = Term::MultiSpinner->new( clear_on_destruct => 0 );

    for my $i (1..50) {
        if(not $i % 10) {
            $spinner->finish(($i/10)-1);
        }
        if($i < 50) {
         $spinner->advance(4);
         if($i < 40) {
          $spinner->advance(3);
          if($i < 30) {
           $spinner->advance(2);
           if($i < 20) {
            $spinner->advance(1);
            if($i < 10) {
             $spinner->advance(0);
            }
           }
          }
         }
        }
        select(undef, undef, undef, 0.1);
    }
}
print STDERR "\n";
sleep(1);

print STDERR "Randomized Rolling Finish: ";
{
    my $spinner = Term::MultiSpinner->new( clear_on_destruct => 0 );
    my $map = [7,5,2,9,6,1,4,0,8,3];

    for my $i (1..100) {
        if(not $i % 10) {
            $spinner->finish($map->[($i/10)-1]);
        }
        if($i < 100) {
         $spinner->advance($map->[9]) if int(rand(3));
         if($i < 90) {
          $spinner->advance($map->[8]) if int(rand(3));
          if($i < 80) {
           $spinner->advance($map->[7]) if int(rand(3));
           if($i < 70) {
            $spinner->advance($map->[6]) if int(rand(3));
            if($i < 60) {
             $spinner->advance($map->[5]) if int(rand(3));
             if($i < 50) {
              $spinner->advance($map->[4]) if int(rand(3));
              if($i < 40) {
               $spinner->advance($map->[3]) if int(rand(3));
               if($i < 30) {
                $spinner->advance($map->[2]) if int(rand(3));
                if($i < 20) {
                 $spinner->advance($map->[1]) if int(rand(3));
                 if($i < 10) {
                  $spinner->advance($map->[0]) if int(rand(3));
                 }
                }
               }
              }
             }
            }
           }
          }
         }
        }
        select(undef, undef, undef, 0.1);
    }
}
print STDERR "\n";

print STDERR "a through f: ";

{
    my $spinner = Term::MultiSpinner->new(
        spin_chars => [qw/a b c d e f/],
        clear_on_destruct => 0
    );

    for my $i (1..25) {
        $spinner->advance(1);
        $spinner->advance(0) if not $i % 5;
        select(undef, undef, undef, 0.1);
    }
}
print STDERR "\n";
sleep(1);