using SeaHaven.DataServices.Models; namespace SeaHaven.Services.Helpers { public static class VendorConflictPairs { // Group by vendor so cross-vendor intervals are never compared, then sweep the // start-sorted windows within a vendor. Every overlapping pair is still emitted; // output is O(n log n + p) where p is the number of emitted pairs, so the worst // case stays quadratic only when a single vendor has many mutually-overlapping // windows, which is inherent to enumerating all such pairs. public static IEnumerable<(ScheduledDispatchReadModel Left, ScheduledDispatchReadModel Right)> Build( IReadOnlyList dispatches) { foreach (var group in dispatches.GroupBy(dispatch => dispatch.VendorId)) { var sorted = group.OrderBy(dispatch => dispatch.Start).ToList(); for (var leftIndex = 0; leftIndex < sorted.Count; leftIndex++) { var left = sorted[leftIndex]; for (var rightIndex = leftIndex + 1; rightIndex < sorted.Count; rightIndex++) { var right = sorted[rightIndex]; // Sorted by start: once a window starts at or after left's end, none that follow can overlap it. if (right.Start >= left.End) break; if (left.WorkOrderId != right.WorkOrderId) yield return (left, right); } } } } } }