public static Schedule ScheduleUnassignedFlights(Schedule schedule)
        {
            if (schedule.UnscheduledFlights.Count == 0)
            {
                return schedule;
            }

            var working = schedule.Clone();
            var unscheduled = new Queue<FlightModel>(
                working.UnscheduledFlights.OrderBy(f => f.Arrives));
            working.ScheduleFlights(unscheduled);
            var best = working.Clone();

            int iterations = working.Flights.Count - 1;
            while (working.UnscheduledFlights.Count > 0 && iterations-- > 0)
            {
                unscheduled.Enqueue(unscheduled.Dequeue());
                working.ScheduleFlights(unscheduled);
                if (working.UnscheduledFlights.Count < best.UnscheduledFlights.Count)
                {
                    best = working.Clone();
                }
            }
            return best;
        }
 public Schedule Clone()
 {
     var clone = new Schedule();
     clone._gates.AddRange(Gates.Select(g => g.Clone()));
     clone._flights.AddRange(Flights.Select(f => f.Clone()));
     return clone;
 }
        public DeparturesEndpoint(Schedule schedule)
            : base("/departures")
        {
            _schedule = schedule;

            Get["/"] = _ => _schedule.Flights
                .OrderBy(f => f.Departs)
                .Select(f =>
                    new
                    {
                        f.Flight,
                        f.Departs,
                        f.Gate
                    });
        }
        public ArrivalsModule(Schedule schedule)
            : base("/arrivals")
        {
            _schedule = schedule;

            Get["/"] = _ => _schedule.Flights
                .OrderBy(f => f.Arrives)
                .Select(f =>
                    new
                    {
                        f.Flight,
                        f.Arrives,
                        f.Gate
                    });
        }
 private void UpdateFrom(Schedule schedule)
 {
     ClearAll();
     _gates.AddRange(schedule.Gates.Select(g => g.Clone()));
     _flights.AddRange(schedule.Flights.Select(f => f.Clone()));
 }