From 0894f68085a8ef9bfd3c673339416c014be02f85 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 3 Feb 2024 16:09:55 +0000 Subject: show more than 1 bus stop --- lib/HomePanel/Driver.pm | 24 ++++++++++++++++++++---- lib/WebService/TFL/Bus/Prediction.pm | 2 +- lib/WebService/TFL/Bus/Response.pm | 20 +++++++++++++++++++- 3 files changed, 40 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/HomePanel/Driver.pm b/lib/HomePanel/Driver.pm index ce3026a..e9ea31f 100644 --- a/lib/HomePanel/Driver.pm +++ b/lib/HomePanel/Driver.pm @@ -7,9 +7,11 @@ use Net::Async::HTTP; use Future::AsyncAwait; use WebService::ForecastIo; use WebService::TFL::Bus; +use WebService::TFL::Bus::Response; use WebService::TFL::TubeStatus; use HomePanel::Render; use Types::Path::Tiny qw(AbsFile AbsPath); +use Types::Standard qw(ArrayRef Str StrictNum); use Try::Tiny; use curry::weak; use namespace::clean; @@ -31,10 +33,12 @@ sub _build_user_agent { } has [qw(forecast_latitude forecast_longitude)] => ( + isa => StrictNum, is => 'ro', required => 1, ); has forecast_key => ( + isa => Str, is => 'ro', required => 1, ); @@ -65,7 +69,12 @@ sub forecast_timer_cb { })->then(sub { $self->forecast_response(shift) })->retain; } -has bus_stop_id => ( is => 'ro', required => 1 ); +has bus_stop_ids => ( + is => 'ro', + required => 1, + isa => ArrayRef->of(Str)->plus_coercions(Str, sub { [ $_ ] }), + coerce => 1, +); has bus => ( is => 'lazy', ); @@ -86,9 +95,16 @@ sub _build_bus_timer { sub bus_timer_cb { my ($self) = @_; - $self->bus->request( - $self->bus_stop_id - )->then(sub { $self->bus_response(shift) })->retain; + Future->wait_all( + map { $self->bus->request($_) } $self->bus_stop_ids->@* + )->then( + sub { + my @done_results = map { $_->result } grep { $_->is_done } @_; + $self->bus_response( + WebService::TFL::Bus::Response->new_merged(@done_results) + ); + } + )->retain; }; has tube => ( diff --git a/lib/WebService/TFL/Bus/Prediction.pm b/lib/WebService/TFL/Bus/Prediction.pm index 670baf7..8873b02 100644 --- a/lib/WebService/TFL/Bus/Prediction.pm +++ b/lib/WebService/TFL/Bus/Prediction.pm @@ -4,7 +4,7 @@ use Types::Standard -all; use Types::DateTime -all; use namespace::clean; -has [qw(stationName lineName towards)] => ( +has [qw(stationName destinationName lineName towards)] => ( is => 'ro', isa => Str, required => 1, diff --git a/lib/WebService/TFL/Bus/Response.pm b/lib/WebService/TFL/Bus/Response.pm index 0f811fc..59582be 100644 --- a/lib/WebService/TFL/Bus/Response.pm +++ b/lib/WebService/TFL/Bus/Response.pm @@ -9,12 +9,20 @@ has predictions => ( isa => ArrayRef[InstanceOf['WebService::TFL::Bus::Prediction']], ); +sub _sort { + return sort { + $a->destinationName cmp $b->destinationName + || + $a->expectedArrival <=> $b->expectedArrival + } @_; +} + sub new_from_response { my ($class,$response_data) = @_; return $class->new({ predictions => [ - sort { $a->expectedArrival <=> $b->expectedArrival } + _sort map { WebService::TFL::Bus::Prediction->new_from_response($_) } grep { $_->{'$type'} =~ /\bPrediction\b/ } $response_data->@* @@ -22,4 +30,14 @@ sub new_from_response { }); } +sub new_merged { + my ($class, @responses) = @_; + + return $class->new({ + predictions => [ + _sort map { $_->predictions->@* } @responses + ], + }); +} + 1; -- cgit v1.2.3