Files
go-gtfs/pkg/types/stop.go
2025-11-15 00:23:48 +01:00

94 lines
2.1 KiB
Go

package types
import (
"iter"
"time"
)
type Stop struct {
Trips map[string]*Trip `json:"-" csv:"-"`
StopId string `json:"stop_id" csv:"stop_id"`
StopName string `json:"stop_name" csv:"stop_name"`
StopLat float64 `json:"stop_lat" csv:"stop_lat"`
StopLon float64 `json:"stop_lon" csv:"stop_lon"`
LocationType int `json:"location_type" csv:"location_type"`
Transfers []*Transfer `json:"-" csv:"transfers"`
}
func (s *Stop) AddTransfer(transfer *Transfer) {
if s.Transfers == nil {
s.Transfers = make([]*Transfer, 0)
}
s.Transfers = append(s.Transfers, transfer)
}
func (s *Stop) AddTrip(trip *Trip) {
s.Trips[trip.TripId] = trip
}
type TripWithDepartureTime struct {
*Trip
DepartureTime SecondsAfterMidnight
}
func (s *Stop) GetTripsAfter(when time.Time) iter.Seq[*TripWithDepartureTime] {
startAfterMidnight := AsSecondsAfterMidnight(when)
return func(yield func(*TripWithDepartureTime) bool) {
for _, trip := range s.Trips {
for _, stop := range trip.Stops {
if stop.StopId == s.StopId && stop.ArrivalTime >= startAfterMidnight {
if !yield(&TripWithDepartureTime{Trip: trip, DepartureTime: stop.DepartureTime}) {
return
}
break
}
}
}
}
}
func (s *Stop) GetUpcomingStops(start *StopTime) iter.Seq[*StopTime] {
return func(yield func(*StopTime) bool) {
found := false
for _, trip := range s.Trips {
for _, stop := range trip.Stops {
if !found {
if stop.StopId == start.StopId && stop.DepartureTime >= start.ArrivalTime {
found = true
}
} else {
if !yield(stop) {
return
}
}
}
}
}
}
func (s *Stop) GetStopsAfter(when time.Time) iter.Seq2[*StopTime, *StopTime] {
startAfterMidnight := AsSecondsAfterMidnight(when)
return func(yield func(start, stop *StopTime) bool) {
for _, trip := range s.Trips {
found := false
var start *StopTime
for _, stop := range trip.Stops {
if stop.StopId == s.StopId && stop.ArrivalTime >= startAfterMidnight {
found = true
start = stop
}
if found {
if !yield(start, stop) {
return
}
}
}
}
}
}