public U Run <U>() where U : Errand <T>, new() { var errand = ErrandFactory <T> .Get <U>(); errand.Attach(this, _entities, Game); var type = typeof(U); _addQueue.Add(ErrandStoreFactory.Get(errand, type)); return(errand); }
public void CommitErrandChanges() { foreach (var item in _addQueue) { var errand = item.Errand; var type = item.Type; var doesListExist = _errands.TryGetValue(type, out var errands); if (!doesListExist) { errands = new List <Errand <T> >(); _errands[type] = errands; } errands.Add(errand); ErrandStoreFactory.Recycle(item); } foreach (var item in _removeQueue) { var value = item.Errand; var type = item.Type; var isInitialized = _errands.TryGetValue(type, out var errands); if (!isInitialized) { throw new Exception($"Trying to remove errand with nonexistant type {type}"); } var isInList = errands.Remove(value); if (isInList) { ErrandFactory <T> .Recycle(value, type); } ErrandStoreFactory.Recycle(item); } _addQueue.Clear(); _removeQueue.Clear(); }
public void CancelAll <U>() where U : Errand <T>, new() { var isInitialized = _errands.TryGetValue(typeof(U), out var errands); if (isInitialized) { var type = typeof(U); foreach (var errand in errands) { Remove(errand, type); } for (var i = 0; i < _addQueue.Count; i++) { if (_addQueue[i].Type.Equals(type)) { Remove(_addQueue[i].Errand, _addQueue[i].Type); ErrandStoreFactory.Recycle(_addQueue[i]); _addQueue.RemoveAt(i); i -= 1; } } } }
public void Remove(Errand <T> value, Type type) { _removeQueue.Add(ErrandStoreFactory.Get(value, type)); }