/Vector/Paginator.pm
package Vector::Paginator;
use strict;

sub new {
	my ($class, $baseuri, $page, @items) = @_;

	my $self = {
		baseuri => $baseuri,
		page => $page || 0,
		items => \@items,
		stride => 5,
	};

	return bless $self, $class;
}

sub count {
	my ($self) = @_;
	return int((@{$self->{items}} - 1) / $self->{stride});
}

sub page_items {
	my ($self) = @_;

	my $len = @{$self->{items}};
	my $start = $self->{page} * $self->{stride};
	if ($start >= $len) {
		return ();
	}
	my $end = $start + $self->{stride} - 1;
	if ($end >= $len) {
		$end = $len - 1;
	}

	return @{$self->{items}}[$start..$end];
}

sub navigator {
	my ($self) = @_;

	my $count = $self->count;
	my @r;

	if ($self->{page} == 1) {
		push @r, qq{<a href="$self->{baseuri}">prev</a>};
	} elsif ($self->{page} > 0) {
		my $ppage = $self->{page} - 1;
		push @r, qq{<a href="$self->{baseuri}?page=$ppage">prev</a>};
	} else {
		push @r, 'prev';
	}

	for my $n (0..$count) {
		my $uri;
		if ($n == 0) {
			$uri = $self->{baseuri};
		} else {
			$uri = "$self->{baseuri}?page=$n";
		}
		if ($n == $self->{page}) {
			push @r, $n;
		} else {
			push @r, qq{<a href="$uri">$n</a>};
		}
	}

	if ($self->{page} < $count - 1) {
		my $npage = $self->{page} + 1;
		push @r, qq{<a href="$self->{baseuri}?page=$npage">next</a>};
	} else {
		push @r, 'next';
	}

	return join(' ', @r);
}

1;