public T Get(Container self, ref TrackableObjectMixIn <Container> mixIn) { if (Tracker.AreEvaluating) { Tracker.NoteEvaluation(GetOurselvesAsDependency(self)); if (trackingData == null) { trackingData = new TrackingData <T>(); trackingData.haveModifiedDependencies = true; } } if (trackingData != null) { if (NeedsUpdate) { using (Tracker.Batch()) Update(self, ref mixIn, "on value request during tracking evaluation"); } return(GetCachedValue()); } else { return(accessor.Get(self)); } }
public void Subscribe(Container self, ref TrackableObjectMixIn <Container> mixIn, Subscriber subscriber) { if (trackingData == null) { trackingData = new TrackingData <T>(); Update(self, ref mixIn, $"on alert due to subscription by {subscriber.ToString()}"); } trackingData.subscribers.Add(subscriber); }
void RelaxIfAppropriate(Container self) { if (trackingData == null) { return; } if (trackingData.subscribers.Count > 0) { return; } Tracker.logger.Log(GetName(self), $"indeed relaxing"); foreach (var dependency in trackingData.dependencies) { dependency.target.Unsubscribe(dependency.index, GetOurselvesAsSubscriber(self)); } trackingData = null; }