public bool IsValidStateChangeTo(ModuleState anotherModuleState) { if (!RecoveriesLeft.HasValue && anotherModuleState.RecoveriesLeft.HasValue || RecoveriesLeft.HasValue && !anotherModuleState.RecoveriesLeft.HasValue) { throw new ArgumentException( "Cannot compare states with infinite and finite recovery numbers.", nameof(anotherModuleState)); } var infiniteRecoveryPossible = RecoveriesLeft == null; if (IsWorking != anotherModuleState.IsWorking && infiniteRecoveryPossible) { return(true); } if (IsWorking && !anotherModuleState.IsWorking && RecoveriesLeft == anotherModuleState.RecoveriesLeft) { return(true); } if (!IsWorking && anotherModuleState.IsWorking && RecoveriesLeft == anotherModuleState.RecoveriesLeft + 1) { return(true); } return(false); }
public OneStateTransition(ModuleState from, ModuleState to) { From = from; To = to; }