minotor
Version:
A lightweight client-side transit routing library.
176 lines (175 loc) • 7.98 kB
TypeScript
import { StopId } from '../stops/stops.js';
import { Duration, Time } from '../timetable/time.js';
import { Result } from './result.js';
import { Route } from './route.js';
import { Arrival } from './state.js';
/**
* A single departure-time iteration that produced at least one Pareto-optimal
* journey to this result's destination set.
*/
export type ParetoRun = {
/** Departure time from the origin (minutes from midnight) for this run. */
readonly departureTime: Time;
/** Full RAPTOR result for this departure time — use it to reconstruct routes. */
readonly result: Result;
};
/**
* An {@link Arrival} enriched with the travel duration from the origin.
*
* Returned by duration-based methods on {@link RangeResult} so callers
* receive both the absolute arrival time with transfer count *and* the total
* travel time that was optimized over.
*/
export type ArrivalWithDuration = Arrival & {
/** Total travel time from origin departure to stop arrival (minutes). */
readonly duration: Duration;
};
/**
* The result of a Range RAPTOR query.
*
* Contains the complete Pareto-optimal set of journeys for a resolved
* destination set, **or** the full per-departure-time routing state when no
* destinations were provided (full-network / isochrone mode).
*
* **Pareto dominance**: journey J1 dominates J2 iff
* `τdep(J1) ≥ τdep(J2) AND τarr(J1) ≤ τarr(J2)`
* (with at least one strict inequality).
*
* Runs are ordered **latest-departure-first**: each successive run departs
* strictly earlier *and* arrives strictly earlier than the previous one,
* forming the classic staircase Pareto frontier.
*
* **Full-network mode** (empty `destinations`): when no destinations are
* supplied to the range query every departure slot in the window becomes its
* own run, because destination-based Pareto pruning cannot be applied.
* In this mode the destination-specific helpers ({@link getRoutes},
* {@link bestRoute}, {@link latestDepartureRoute}, {@link fastestRoute})
* return empty results; use {@link allEarliestArrivals},
* {@link allShortestDurations}, {@link earliestArrivalAt}, or
* {@link shortestDurationTo} instead.
*
* Destination handling is delegated to {@link Result}, which expands
* equivalent stops when reconstructing routes or looking up arrivals.
*/
export declare class RangeResult {
private readonly _runs;
private readonly _destinations;
constructor(runs: ParetoRun[], destinations: ReadonlySet<StopId>);
/** The resolved destination stop IDs for this result. */
get destinations(): ReadonlySet<StopId>;
private normalizeTargets;
/**
* Returns all non-dominated routes to this result's default destination set,
* ordered from the earliest departure to the latest departure.
*
* Each route in the list departs strictly earlier *and* arrives strictly
* earlier than its predecessor.
*
* Returns an empty array when no destinations were provided (full-network
* mode). Use {@link allEarliestArrivals} or {@link allShortestDurations}
* to query individual stops in that case.
*/
getRoutes(): Route[];
/**
* The route that arrives **earliest** at the given stop(s) across all
* Pareto-optimal runs.
*
* When two runs achieve the same arrival time at the target, the one with
* the **later departure** is preferred — you wait at the origin rather than
* at a transit stop.
*
* Defaults to this result's own destination stop(s) when `to` is omitted.
* Always pass an explicit `to` stop when operating in full-network mode
* (no destinations), otherwise `undefined` is returned.
*
* @param to Optional destination stop ID or set of stop IDs.
* @returns The reconstructed {@link Route} with the earliest arrival,
* or `undefined` if the target is unreachable in every run.
*/
bestRoute(to?: StopId | Set<StopId>): Route | undefined;
/**
* The route with the **latest possible departure** from the origin among all
* Pareto-optimal journeys in the window.
*
* This is the journey that lets you leave the origin as late as possible.
* It does **not** necessarily achieve the earliest arrival — for that, use
* {@link bestRoute}. For the shortest travel duration, use
* {@link fastestRoute}.
*
* Defaults to this result's own destination stop(s) when `to` is omitted.
* Always pass an explicit `to` stop when operating in full-network mode
* (no destinations), otherwise `undefined` is returned.
*
* @param to Optional destination stop ID or set of stop IDs.
* @returns The reconstructed {@link Route} with the latest departure,
* or `undefined` if the target is unreachable in every run.
*/
latestDepartureRoute(to?: StopId | Set<StopId>): Route | undefined;
/**
* Reconstructs the **fastest** route to the given stop(s) — the journey with
* the shortest travel duration (arrival time − origin departure time) across
* all Pareto-optimal runs.
*
* Unlike {@link bestRoute}, which returns the route that departs as late as
* possible while still arriving early, this method minimizes total time
* spent traveling.
*
* Defaults to this result's own destination stop(s) when `to` is omitted.
* Always pass an explicit `to` stop when operating in full-network mode
* (no destinations), otherwise `undefined` is returned.
*
* @param to Optional destination stop ID or set of stop IDs.
* @returns The reconstructed fastest {@link Route}, or `undefined` if the
* target is unreachable in every run.
*/
fastestRoute(to?: StopId | Set<StopId>): Route | undefined;
/** Number of Pareto-optimal journeys found. */
get size(): number;
/**
* Earliest achievable arrival at a stop across all Pareto-optimal runs.
*
* Useful for isochrone / accessibility analysis: given this result's
* departure-time frontier, how early can you reach stop `s` regardless of
* which specific trip you take?
*
* Equivalent stops are handled by {@link Result.arrivalAt}.
*
* @param stop The target stop ID.
* @param maxTransfers Optional upper bound on the number of transfers.
*/
earliestArrivalAt(stop: StopId, maxTransfers?: number): Arrival | undefined;
/**
* Shortest travel duration to reach a stop across all Pareto-optimal runs.
*
* For each run, duration is measured from the run's origin departure time to
* the earliest arrival at `stop` within that run. The minimum across all
* runs is returned.
*
* Equivalent stops are handled by {@link Result.arrivalAt}.
*
* Duration is **not** monotone along the Pareto frontier — a run that
* departs later may still travel faster — so every run is checked. In
* practice the Pareto frontier is small, so this is O(runs).
*
* Returns `undefined` if `stop` is unreachable in every run.
*
* @param stop The target stop ID.
* @param maxTransfers Optional upper bound on the number of transfers.
*/
shortestDurationTo(stop: StopId, maxTransfers?: number): ArrivalWithDuration | undefined;
/**
* Shortest travel duration to **every reachable stop** across all
* Pareto-optimal runs, as a single `Map<StopId, DurationArrival>`.
*/
allShortestDurations(): Map<StopId, ArrivalWithDuration>;
/**
* Earliest achievable arrival at **every reachable stop** across all
* Pareto-optimal runs, as a single `Map<StopId, Arrival>`.
*/
allEarliestArrivals(): Map<StopId, Arrival>;
/**
* Iterates over all Pareto-optimal `(departureTime, result)` pairs,
* ordered from the latest departure to the earliest departure.
*/
[Symbol.iterator](): IterableIterator<ParetoRun>;
}