diff options
author | Daniel Friesel <derf@finalrewind.org> | 2019-11-25 21:18:57 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2019-11-25 21:18:57 +0100 |
commit | 4f0fee7783d3919110287ee9edd0c3a86e961814 (patch) | |
tree | 5080e355e0f1d268c526073b0a12b84aff6295cd /lib | |
parent | 613f7d6087ab62f9fd36d3cb2c42da1f91ebb48e (diff) |
show cancelled trains in connections list
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/Travelynx.pm | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index a07d851..1c5b449 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -2276,6 +2276,7 @@ sub startup { map { [ $_, $_->departure ? $_->departure->epoch : 0 ] } @{ $stationboard->{results} }; my @results; + my @cancellations; my %via_count = map { $_ => 0 } @destinations; for my $train ( @{ $stationboard->{results} } ) { if ( not $train->departure ) { @@ -2291,14 +2292,43 @@ sub startup { { next; } - my @via = ( $train->route_post, $train->route_end ); - for my $dest (@destinations) { - if ( $via_count{$dest} < 2 - and List::Util::any { $_ eq $dest } @via ) - { - push( @results, [ $train, $dest ] ); - $via_count{$dest}++; - next; + + # In general, this function is meant to return feasible + # connections. However, cancelled connections may also be of + # interest and are also useful for logging cancellations. + # To satisfy both demands with (hopefully) little confusion and + # UI clutter, this function returns two concatenated arrays: + # actual connections (ordered by actual departure time) followed + # by cancelled connections (ordered by scheduled departure time). + # This is easiest to achieve in two separate loops. + # + # Note that a cancelled train may still have a matching destination + # in its route_post, e.g. if it leaves out $ds100 due to + # unscheduled route changes but continues on schedule afterwards + # -- so it is only cancelled at $ds100, not on the remainder of + # the route. Also note that this specific case is not yet handled + # properly by the cancellation logic etc. + + if ( $train->departure_is_cancelled ) { + my @via + = ( $train->sched_route_post, $train->sched_route_end ); + for my $dest (@destinations) { + if ( List::Util::any { $_ eq $dest } @via ) { + push( @cancellations, [ $train, $dest ] ); + next; + } + } + } + else { + my @via = ( $train->route_post, $train->route_end ); + for my $dest (@destinations) { + if ( $via_count{$dest} < 2 + and List::Util::any { $_ eq $dest } @via ) + { + push( @results, [ $train, $dest ] ); + $via_count{$dest}++; + next; + } } } } @@ -2311,8 +2341,11 @@ sub startup { $_->[0]->departure->epoch // $_->[0]->sched_departure->epoch ] } @results; + @cancellations = map { $_->[0] } + sort { $a->[1] <=> $b->[1] } + map { [ $_, $_->[0]->sched_departure->epoch ] } @cancellations; - return @results; + return ( @results, @cancellations ); } ); |