public void ScheduleFlight(FlightModel flight)
        {
            _db.AddFlight(flight);

            ICollection<FlightModel> priorGateFlights = new FlightModel[0];
            foreach (var gate in _db.Gates.OrderBy(g => g.Gate))
            {
                var gateFlights = _db.GetFlightsForGate(gate.Gate).ToList();

                try
                {
                    if (priorGateFlights.Any(f => !flight.CanLoadAtGateNextTo(f)))
                    {
                        continue;
                    }

                    if (gateFlights.Any(f => !f.CanLoadAtSameGateAs(flight)))
                    {
                        continue;
                    }

                    _db.SetFlightGate(flight, gate.Gate);
                    break;
                }
                finally
                {
                    priorGateFlights = gateFlights;
                }
            }
        }
 public bool CanLoadAtGateNextTo(FlightModel flight)
 {
     TimeSpan minDist = TimeSpan.FromMinutes(10);
     return Arrives.DistanceFrom(flight.Arrives) >= minDist
            && Arrives.DistanceFrom(flight.Departs) >= minDist
            && Departs.DistanceFrom(flight.Arrives) >= minDist
            && Departs.DistanceFrom(flight.Departs) >= minDist;
 }
 public void ScheduleFlight(FlightModel flight)
 {
     foreach (var gate in _db.Gates)
     {
         var existingFlights = _db.GetFlightsForGate(gate.Gate).ToList();
         if(!existingFlights.Any(ef => Math.Abs((ef.Arrives - flight.Arrives).TotalHours) < 1))
         {
             _db.SetFlightGate(flight.Flight, gate.Gate);
             break;
         }
     }
 }
 public void ScheduleFlight(FlightModel flight)
 {
     _db.AddFlight(flight);
     foreach (var gate in _db.Gates)
     {
         var existingFlights = _db.GetFlightsForGate(gate.Gate);
         if(!existingFlights.Any(f => f == null || !f.CanShareGateWith(flight)))
         {
             _db.SetFlightGate(flight, gate.Gate);
             break;
         }
     }
 }
 public bool CanLoadAtSameGateAs(FlightModel flight)
 {
     return Range.DistanceFrom(flight.Range) >= TimeSpan.FromMinutes(30);
 }
 public GateModel GetGateForFlight(FlightModel flight)
 {
     return _gates.Single(g => flight.Gate == g.Gate);
 }
        private GateModel FindOpenGateFor(FlightModel flight)
        {
            ICollection<FlightModel> priorGateFlights = new FlightModel[0];
            foreach (var gate in Gates.OrderBy(g => g.Gate))
            {
                var gateFlights = GetFlightsForGate(gate.Gate).ToList();

                try
                {
                    if (priorGateFlights.Any(f => !flight.CanLoadAtGateNextTo(f)))
                    {
                        continue;
                    }

                    if (gateFlights.Any(f => !f.CanLoadAtSameGateAs(flight)))
                    {
                        continue;
                    }

                    return gate;
                }
                finally
                {
                    priorGateFlights = gateFlights;
                }
            }
            return null;
        }
 public bool CanShareGateWith(FlightModel flight)
 {
     return Range.DistanceFrom(flight.Range) >= TimeSpan.FromMinutes(30);
 }
 public void SetFlightGate(FlightModel flight, string gate)
 {
     flight.Gate = gate;
 }
 public void AddFlight(FlightModel flight)
 {
     _flights.Add(flight);
 }
 public bool CanShareGateWith(FlightModel flight)
 {
     return !Range.Overlaps(flight.Range)
            && Math.Abs((Arrives - flight.Arrives).TotalHours) >= 1;
 }
 public void ScheduleFlight(FlightModel flight)
 {
     // _schedulerDatabase.SetGateForFlight(flight, gate) ...
 }
 public void ScheduleFlight(FlightModel flight)
 {
     _db.SetFlightGate(flight.Flight, _db.Gates.First().Gate);
 }