Data-PaginatedTable

 view release on metacpan or  search on metacpan

lib/Data/PaginatedTable.pm  view on Meta::CPAN

use 5.18.2;
use Modern::Perl;
use Moops;

class Data::PaginatedTable 1.0.0 {
    use Types::XSD::Lite qw( PositiveInteger );
    use Text::Table;
    use XML::Simple;
    use XML::Simple::Sugar;
    use POSIX qw(ceil);
    use overload '""'         => 'as_string';
    use overload '@{}'        => 'pages';
    use constant VERTICAL     => 'vertical';
    use constant HORIZONTAL   => 'horizontal';
    use constant HTML         => 'html';
    use constant PREFORMATTED => 'preformatted';
    use constant RAW          => 'raw';

    has rows    => ( is => 'rw', isa => PositiveInteger, default  => 4 );
    has columns => ( is => 'rw', isa => PositiveInteger, default  => 3 );
    has data    => ( is => 'rw', isa => ArrayRef,        required => true );
    has fill_direction => (
        is      => 'rw',
        isa     => Enum [ VERTICAL, HORIZONTAL ],
        default => HORIZONTAL
    );
    has string_mode =>
      ( is => 'rw', isa => Enum [ HTML, PREFORMATTED, RAW ], default => RAW );
    has current => ( is => 'rw', isa => PositiveInteger, default => 1 );

    method page ( $page? ) {
        $self->current($page) if defined $page;

        my $data = $self->data;
        my $min  = $self->rows * $self->columns * ( $self->current - 1 );
        my $max  = $self->rows * $self->columns * $self->current - 1;

        my $i       = 0;
        my $k       = 0;
        my $next_ik = $self->fill_direction eq VERTICAL
          ? sub {
            $i++;
            if ( $i == $self->rows ) { $i = 0; $k++; }
          }
          : sub {
            $k++;
            if ( $k == $self->columns ) { $k = 0; $i++; }
          };

        my @table;
        foreach my $row ( @{$data}[ $min .. $max ] ) {
            $table[$i][$k] = $row;
            $next_ik->();
        }

        \@table;
    }

    method pages {
        [ map { $self->page($_) } 1 .. $self->page_count ];
    }

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 1.269 second using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )