diff --git a/Timetable/Route.cs b/Timetable/Route.cs index db74454..6b5844a 100644 --- a/Timetable/Route.cs +++ b/Timetable/Route.cs @@ -106,9 +106,11 @@ public bool LooselyIsReverse(Route other) => StopPositions.Last().Stop == other. /// /// Whether this route and route have identical start and end stops. /// - public bool LooselyIsSame(Route other) => InterpretAsBidirectional == other.InterpretAsBidirectional && - StopPositions.First().Stop == other.StopPositions.First().Stop && - StopPositions.Last().Stop == other.StopPositions.Last().Stop; + public bool LooselyIsSame(Route other, bool enforceIdenticalManualAnnotation) => + InterpretAsBidirectional == other.InterpretAsBidirectional && + StopPositions.First().Stop == other.StopPositions.First().Stop && + StopPositions.Last().Stop == other.StopPositions.Last().Stop && + (enforceIdenticalManualAnnotation == false || ManualAnnotation == other.ManualAnnotation); /// /// Whether this route stops at exactly the same s as but in reverse. diff --git a/TransitWebViewer/Pages/Vip/History.razor b/TransitWebViewer/Pages/Vip/History.razor index 47d13b6..0cb6bfd 100644 --- a/TransitWebViewer/Pages/Vip/History.razor +++ b/TransitWebViewer/Pages/Vip/History.razor @@ -261,24 +261,44 @@ { @code { - private static IEnumerable>> RemoveDuplicatesWithPrevious(IEnumerable>> frequencies, string lineId) + private record FrequencyComparisonCell(string? Previous, string Now); + + private static IEnumerable>> NowToComparison(IEnumerable>> current) + => current.Select(kvp => new KeyValuePair>(kvp.Key, kvp.Value.Select(now => new FrequencyComparisonCell(null, now)).ToList())); + + private static List>> RemoveDuplicatesWithPrevious(List>> frequencies, string lineId) { - if (_previous is null) return frequencies; - if (_previous.OrderedLinesById.All(pair => pair.Key != lineId)) return frequencies; + if (_previous is null || _previous.OrderedLinesById.All(pair => pair.Key != lineId)) return frequencies; var previousFrequencies = GetFrequencies(_previous.OrderedLinesById.Single(pair => pair.Key == lineId).Value, lineId, false); + // var frequenciesWithComparison = NowToComparison(frequencies, previousFrequencies); return frequencies.Where(frequency => { - var value = previousFrequencies.Where(previous => frequency.Key.LooselyIsSame(previous.Key) && frequency.Value.SequenceEqual(previous.Value)).ToDictionary(); + var value = previousFrequencies.Where(previous => frequency.Key.LooselyIsSame(previous.Key, true) && frequency.Value.Select(comparison => comparison.Now).SequenceEqual(previous.Value.Select(comparison => comparison.Now))).ToDictionary(); var ret = value.Count == 0; // Console.Error.WriteLine(frequency.Key); // Console.Error.WriteLine(string.Join(" | ", value.Select(val => $"{val.Key}: {string.Join(", ", val.Value)}"))); return ret; - }); + }).Select(frequency + => previousFrequencies.Keys.Any(key => frequency.Key.LooselyIsSame(key, true)) ? new KeyValuePair>( + frequency.Key, + frequency.Value + .Zip(previousFrequencies[previousFrequencies.Keys.Where(key => frequency.Key.LooselyIsSame(key, true)).ToList().Count > 1 ? throw new Exception($"Multiple:\n\t{string.Join(",\n\t", previousFrequencies.Keys.Where(key => frequency.Key.LooselyIsSame(key, true)).ToList())}") : previousFrequencies.Keys.Single(key => frequency.Key.LooselyIsSame(key, true))]) + .Select(tuple => tuple.First with { Previous = tuple.Second.Now }).ToList() + ) : frequency + ).ToList();/* + ){ + for (var i = 0; i < frequency.Value.Count; ++i) + { + frequency.Value[i].Previous = previousFrequencies[frequency.Key][i]; + } + } + + return frequencies;*/ } - private static Dictionary> RemoveDuplicates(Dictionary> frequencies, string lineId, bool deduplicateWithPrevious = true) + private static Dictionary> RemoveDuplicates(Dictionary> frequencies, string lineId, bool deduplicateWithPrevious = true) { - var frequenciesList = frequencies.ToList(); + var frequenciesList = NowToComparison(frequencies).ToList(); for (var i = 0; i < frequenciesList.Count; ++i) { // Reset to unidirectional. @@ -298,13 +318,13 @@ if (deduplicateWithPrevious) { - frequenciesList = RemoveDuplicatesWithPrevious(frequenciesList, lineId).ToList(); + frequenciesList = RemoveDuplicatesWithPrevious(frequenciesList, lineId); } return frequenciesList.ToDictionary(); } - private static Dictionary> GetFrequencies(Line line, string lineId, bool deduplicateWithPrevious = true) + private static Dictionary> GetFrequencies(Line line, string lineId, bool deduplicateWithPrevious = true) { var school = LineHelper.GetFrequencies(line, [ (new TimeOnly(1, 0), new TimeOnly(4, 0)), @@ -364,7 +384,18 @@ @foreach (var frequency in frequencies) { - @frequency + + @if (frequency.Previous is { } previous && previous != frequency.Now) + { +
@previous
+
+
@frequency.Now
+ } + else + { + @frequency.Now + } + } }