From bf9072da14d1ee8aa0640c250b7051426665c50b Mon Sep 17 00:00:00 2001 From: dakkar Date: Fri, 17 May 2013 20:47:26 +0100 Subject: data spans --- lib/WebService/ForecastIo/DataBlock.pm | 53 ++++++++++++++++++++++++++++++++++ lib/WebService/ForecastIo/DataSpan.pm | 23 +++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 lib/WebService/ForecastIo/DataSpan.pm (limited to 'lib') diff --git a/lib/WebService/ForecastIo/DataBlock.pm b/lib/WebService/ForecastIo/DataBlock.pm index 9d87b3a..42b3d0e 100644 --- a/lib/WebService/ForecastIo/DataBlock.pm +++ b/lib/WebService/ForecastIo/DataBlock.pm @@ -2,6 +2,7 @@ package WebService::ForecastIo::DataBlock; use Moose; use Moose::Util::TypeConstraints; use WebService::ForecastIo::DataPoint; +use WebService::ForecastIo::DataSpan; class_type 'WebService::ForecastIo::DataBlock'; @@ -17,6 +18,58 @@ 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; diff --git a/lib/WebService/ForecastIo/DataSpan.pm b/lib/WebService/ForecastIo/DataSpan.pm new file mode 100644 index 0000000..256f207 --- /dev/null +++ b/lib/WebService/ForecastIo/DataSpan.pm @@ -0,0 +1,23 @@ +package WebService::ForecastIo::DataSpan; +use Moose; +use MooseX::Types::DateTime; + +has start_time => ( + is => 'ro', + isa => 'DateTime', + required => 1, +); + +has stop_time => ( + is => 'ro', + writer => '_set_stop_time', + isa => 'DateTime', + required => 1, +); + +has value => ( + is => 'ro', + required => 1, +); + +1; -- cgit v1.2.3