1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
use strict;
use warnings;
# Type constraint library…
BEGIN {
package Types::Bookish;
$INC{'Types/Bookish.pm'} = __FILE__;
use Type::Library -base,
-declare => qw( PageNumber PageRangeArray PageRange PageSeriesArray PageSeries );
use Types::Standard qw( Str StrMatch Tuple ArrayRef );
use Types::Common::Numeric qw( PositiveInt );
use Type::Utils -all;
declare PageNumber,
as PositiveInt,
;
declare PageRangeArray,
as Tuple[ PageNumber, PageNumber ],
constraint => '$_->[0] < $_->[1]',
;
declare PageRange,
as StrMatch[ qr/\A([0-9]+)-([0-9]+)\z/, PageRangeArray ],
;
coerce PageRangeArray
from PageRange, q{ [ split /-/, $_ ] },
;
coerce PageRange
from PageRangeArray, q{ join q/-/, @$_ },
;
declare PageSeriesArray,
as ArrayRef[ PageNumber | PageRange ],
constraint => (
# This constraint prevents page series arrays from being in
# the wrong order, like [ 20, '4-16', 12 ].
'my $J = join q/-/, @$_; '.
'my $S = join q/-/, sort { $a <=> $b } split /-/, $J; '.
'$S eq $J'
),
;
declare PageSeries,
as Str,
constraint => (
'my $tmp = [split /\s*,\s*/]; '.
PageSeriesArray->inline_check('$tmp')
),
;
coerce PageSeriesArray
from PageSeries, q{ [ split /\s*,\s*/, $_ ] },
from PageRange, q{ [ $_ ] },
from PageNumber, q{ [ $_ ] },
;
coerce PageSeries
from PageSeriesArray, q{ join q[,], @$_ },
;
__PACKAGE__->meta->make_immutable;
}
use Types::Bookish -types;
use Perl::Tidy;
PageNumber->assert_valid('4');
PageRangeArray->assert_valid([4, 16]);
PageRange->assert_valid('4-16');
PageSeriesArray->assert_valid([ '4-16', 18, 20 ]);
PageSeries->assert_valid('4-16, 18, 20');
Perl::Tidy::perltidy(
source => \( PageSeries->inline_check('$DATA') ),
destination => \( my $tidied ),
);
print $tidied;
|