package WebService::ForecastIo::DataBlock; use Moose; use Moose::Util::TypeConstraints; use WebService::ForecastIo::DataPoint; use WebService::ForecastIo::DataSpan; class_type 'WebService::ForecastIo::DataBlock'; coerce 'WebService::ForecastIo::DataBlock', from 'HashRef', via { WebService::ForecastIo::DataBlock->new($_) }; has [qw(summary icon)] => ( is => 'ro', isa => 'Str', ); has data => ( is => 'ro', isa => 'WebService::ForecastIo::DataPointArray', coerce => 1, traits => [ 'Array' ], handles => { data_points => 'elements', } ); sub spans_by_string { my ($self,$field) = @_; $self->_spans( $field, sub { $_[0] eq $_[1] } ); } sub spans_by_number { my ($self,$field,$tolerance) = @_; $self->_spans( $field, sub { abs($_[0] - $_[1]) <= $tolerance } ); } sub _spans { my ($self,$field,$comp) = @_; my $out; for my $dp ($self->data_points) { next unless $dp->time; my $v = $dp->$field; if (!$out) { $out = [ WebService::ForecastIo::DataSpan->new({ start_time => $dp->time, stop_time => $dp->time, value => $v, }) ]; } else { my $prev = $out->[-1]->value; $out->[-1]->_set_stop_time($dp->time); if (not $comp->($prev,$v)) { # new span push $out, WebService::ForecastIo::DataSpan->new({ start_time => $dp->time, stop_time => $dp->time, value => $v, }); } } } return $out; } 1;