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)) {
push $out, WebService::ForecastIo::DataSpan->new({
start_time => $dp->time,
stop_time => $dp->time,
value => $v,
});
}
}
}
return $out;
}
1;