The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use Tickit;
use Tickit::Widget::VBox;
use Tickit::Widget::SparkLine;
use POSIX qw(tan);

use Tickit::Style;
Tickit::Style->load_style(<<'EOF');
VBox {
	spacing: 1;
}
SparkLine.sin {
fg: 'red';
}
SparkLine.cos {
fg: 'green';
}
SparkLine.tan {
fg: 'blue';
b: 1;
}
EOF

use constant PI => 3.141592653589793238462643383279502884;
my $vbox = Tickit::Widget::VBox->new;
my $tickit = Tickit->new(root => $vbox);

for my $func (qw(sin cos tan)) {
	my $w = Tickit::Widget::SparkLine->new( data => [ (0) x $tickit->cols ], class => $func)->resample_mode('max');
	my $ph = 0.0;
	my $code;
	my $f = CORE->can($func) ? \&{'CORE::' . $func} : \&{'POSIX::' . $func};
	$code = sub {
		$w->shift;
		# Chosen to give ~5s animation time
		$ph += PI / 25;
		my $v = do { no strict 'refs'; $f->($ph); };
		$v = 4 if $v > 4;
		$v = -4 if $v < -4;
		$w->push(4 + $v);
		$tickit->timer(after => 0.10, $code);
	};
	$code->();
	$vbox->add($w, expand => 1);
}
$tickit->run;