public void AddSegment(SegmentInformation segmentInfo) { var sap = segmentInfo.SegmentAlignedPosition; Preconditions.Assert(!_tokensDict.ContainsKey(sap), $"There arleady is segment of sap {sap}"); RequiredSegmentSituation requiredSituation; bool fillingIsNecessary; if (segmentInfo.SegmentState == SegmentState.Active) { fillingIsNecessary = true; requiredSituation = RequiredSegmentSituation.Filled; } else if (segmentInfo.SegmentState == SegmentState.Standby) { fillingIsNecessary = false; requiredSituation = RequiredSegmentSituation.Filled; } else { fillingIsNecessary = false; requiredSituation = RequiredSegmentSituation.Created; } var newToken = new SegmentGenerationProcessToken(SegmentGenerationProcessSituation.BeforeStartOfCreation, requiredSituation); _tokensDict[sap] = new SegmentGenerationProcessTokenWithFillingNecessity() { Token = newToken, FillingIsNecessary = fillingIsNecessary }; _executor.ExecuteSegmentAction(newToken, sap); }
private async Task FillSegment(SegmentGenerationProcessToken token, IntVector2 sap) { Preconditions.Assert(token.CurrentSituation == SegmentGenerationProcessSituation.Created, "Unexpected situaton " + token.CurrentSituation); token.CurrentSituation = SegmentGenerationProcessSituation.DuringFilling; await _segmentFillingFunc(sap, _currentlyCreatedSegments[sap]); token.CurrentSituation = SegmentGenerationProcessSituation.Filled; }
private async Task RemoveSegment(SegmentGenerationProcessToken token, IntVector2 sap) { Preconditions.Assert(!token.ProcessIsOngoing, "Cannot remove while process in ongoing"); Preconditions.Assert(token.RequiredSituation == RequiredSegmentSituation.Removed, "Required situation in not removed but " + token.RequiredSituation); if (_currentlyCreatedSegments.ContainsKey(sap)) { var segment = _currentlyCreatedSegments[sap]; _currentlyCreatedSegments.Remove(sap); await _segmentRemovalFunc(segment); } }
public async Task ExecuteSegmentAction(SegmentGenerationProcessToken token, IntVector2 sap) { if (!token.ProcessIsOngoing) { bool shouldContinue = true; while (shouldContinue) { shouldContinue = await SegmentProcessOneLoop(token, sap); } } }
public Task ExecuteSegmentAction(SegmentGenerationProcessToken token, IntVector2 sap) { if (token.RequiredSituation == RequiredSegmentSituation.Filled || token.RequiredSituation == RequiredSegmentSituation.Created) { return(_segmentFillingFunc(sap)); } else { return(TaskUtils.EmptyCompleted()); } }
private async Task GenerateSegment(SegmentGenerationProcessToken token, IntVector2 sap) { Preconditions.Assert(token.CurrentSituation == SegmentGenerationProcessSituation.BeforeStartOfCreation, "Unexpected situaton " + token.CurrentSituation); if (!_currentlyCreatedSegments.ContainsKey(sap)) { token.CurrentSituation = SegmentGenerationProcessSituation.DuringCreation; var newSegment = await _segmentGeneratingFunc(sap); _currentlyCreatedSegments[sap] = newSegment; } token.CurrentSituation = SegmentGenerationProcessSituation.Created; }
private async Task <bool> SegmentProcessOneLoop(SegmentGenerationProcessToken token, IntVector2 sap) { switch (token.CurrentSituation) { case SegmentGenerationProcessSituation.BeforeStartOfCreation: switch (token.RequiredSituation) { case RequiredSegmentSituation.Created: await GenerateSegment(token, sap); return(true); case RequiredSegmentSituation.Filled: if (!_currentlyCreatedSegments.ContainsKey(sap)) { await GenerateSegment(token, sap); } else { await FillSegment(token, sap); } return(true); case RequiredSegmentSituation.Removed: await RemoveSegment(token, sap); return(false); default: Preconditions.Fail("Unexpected required situation " + token.RequiredSituation); return(false); } case SegmentGenerationProcessSituation.Created: switch (token.RequiredSituation) { case RequiredSegmentSituation.Created: return(false); case RequiredSegmentSituation.Filled: await FillSegment(token, sap); return(true); case RequiredSegmentSituation.Removed: await RemoveSegment(token, sap); return(false); default: Preconditions.Fail("Unexpected required situation " + token.RequiredSituation); return(false); } case SegmentGenerationProcessSituation.Filled: switch (token.RequiredSituation) { case RequiredSegmentSituation.Created: return(false); case RequiredSegmentSituation.Filled: return(false); case RequiredSegmentSituation.Removed: await RemoveSegment(token, sap); return(false); default: Preconditions.Fail("Unexpected required situation " + token.RequiredSituation); return(false); } default: Preconditions.Fail("Unexpected situation " + token.CurrentSituation); return(false); } }
public void ExecuteSegmentAction(SegmentGenerationProcessToken token, IntVector2 sap) { PostPureAsyncAction(() => _executor.ExecuteSegmentAction(token, sap)); }