private LandingCheck GetPreviousLandingCheck(RocketId currentRocketId, DateTime currentTimestamp) { LandingCheck previousLandingCheck = null; foreach (var(rocketId, landingCheck) in _landingChecks) { if (IsSameRocket(currentRocketId, rocketId)) { continue; } if (IsAfterCurrentCheck(currentTimestamp, landingCheck)) { continue; } if (IsOlderThanAlreadyFound(previousLandingCheck, landingCheck)) { continue; } previousLandingCheck = landingCheck; } return(previousLandingCheck); }
private static bool IsOlderThanAlreadyFound(LandingCheck previousLandingCheck, LandingCheck landingCheck) { if (previousLandingCheck is null) { return(false); } return(landingCheck.Timestamp < previousLandingCheck.Timestamp); }
/// <summary> /// Verifies if given landing position is eligible for landing. /// </summary> /// <param name="rocketId">Rocket identifier.</param> /// <param name="position">Potential landing position to check.</param> /// <returns></returns> public async Task <string> VerifyPosition(RocketId rocketId, LandingPosition position) { if (IsOutOfPlatform(position)) { return(OutputMessages.OutOfPlatform); } var landingCheck = new LandingCheck(rocketId, position, _dateTimeProvider.DateTimeUtcNow); var landingCheckRequest = new LandingCheckRequest(landingCheck); await _landingCheckChannel.WriteAsync(landingCheckRequest); var potentialClashPosition = await landingCheckRequest.GetResultAsync(); return(IsClashWithPrevious(position, potentialClashPosition) ? OutputMessages.Clash : OutputMessages.OkForLanding); }
public LandingCheckRequest(LandingCheck landingCheck) { LandingCheck = landingCheck; _taskCompletionSource = new TaskCompletionSource <LandingPosition>(TaskCreationOptions.None); }
private static bool IsAfterCurrentCheck(DateTime currentTimestamp, LandingCheck landingCheck) { return(landingCheck.Timestamp >= currentTimestamp); }
public LandingPosition GetPotentialClashPosition(LandingCheck landingCheck) { var previousLandingCheck = GetPreviousLandingCheck(landingCheck.RocketId, landingCheck.Timestamp); return(previousLandingCheck?.LandingPosition); }
public void AddLandingCheck(LandingCheck landingCheck) { _landingChecks[landingCheck.RocketId] = landingCheck; }