summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2013-05-17 20:47:26 +0100
committerdakkar <dakkar@thenautilus.net>2013-05-17 20:47:26 +0100
commitbf9072da14d1ee8aa0640c250b7051426665c50b (patch)
treebac6f418331c0f697ad9d2ea4724f2ec8aafe9d2 /lib
parentDateTime fields (diff)
downloadHomePanel-bf9072da14d1ee8aa0640c250b7051426665c50b.tar.gz
HomePanel-bf9072da14d1ee8aa0640c250b7051426665c50b.tar.bz2
HomePanel-bf9072da14d1ee8aa0640c250b7051426665c50b.zip
data spans
Diffstat (limited to 'lib')
-rw-r--r--lib/WebService/ForecastIo/DataBlock.pm53
-rw-r--r--lib/WebService/ForecastIo/DataSpan.pm23
2 files changed, 76 insertions, 0 deletions
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;