#!perl ############################################################################### ## ## Perl Weekly Challenge 092, Task #2: Insert Interval ## ############################################################################### #--------------------------------------# # Copyright © 2020 PerlMonk Athanasius # #--------------------------------------# package Interval; use strict; use warnings; use Moo; use Regexp::Common qw( number ); #------------------------------------------------------------------------------ has start => #------------------------------------------------------------------------------ ( is => 'ro', isa => sub { $_[0] =~ / \A $RE{num}{int} \z /x or die qq[ERROR: "$_[0]" is not an integer]; }, required => 1, ); #------------------------------------------------------------------------------ has end => #------------------------------------------------------------------------------ ( is => 'ro', isa => sub { $_[0] =~ / \A $RE{num}{int} \z /x or die qq[ERROR: "$_[0]" is not an integer]; }, required => 1, ); #------------------------------------------------------------------------------ sub BUILD #------------------------------------------------------------------------------ { my ($self) = @_; die sprintf qq[ERROR: Start "%d" is greater than end "%d"\n], $self->start, $self->end unless $self->start <= $self->end; } #------------------------------------------------------------------------------ sub display #------------------------------------------------------------------------------ { my ($self) = @_; return sprintf '(%d,%d)', $self->start, $self->end; } #------------------------------------------------------------------------------ sub precedes #------------------------------------------------------------------------------ { my ($self, $rhs) = @_; return $self->end < $rhs->start; } #------------------------------------------------------------------------------ sub merge #------------------------------------------------------------------------------ { my ($self, $rhs) = @_; my $minimum = $self->start <= $rhs->start ? $self->start : $rhs->start; my $maximum = $self->end >= $rhs->end ? $self->end : $rhs->end; return Interval->new( start => $minimum, end => $maximum ); } ############################################################################### 1; ###############################################################################