private void NotifyOuterKey(ValueChangedNotificationResult <TKey> keyChange, List <TResult> added, List <TResult> removed) { var value = (TaggedObservableValue <TKey, TOuter>)keyChange.Source; var group = groups[keyChange.OldValue]; group.OuterElements.Remove(value); if (group.InnerKeys.Count != 0) { var result = group.OuterElements[value]; removed.Add(result.Value); result.Successors.Unset(this); } if (!groups.TryGetValue(value.Value, out group)) { group = new KeyGroup(); groups.Add(value.Value, group); } var newResult = resultSelector.InvokeTagged(value.Tag, group.InnerElements, value.Tag); newResult.Successors.Set(this); group.OuterElements.Add(value, newResult); if (group.InnerKeys.Count != 0) { added.Add(newResult.Value); } }
public override INotificationResult Notify(IList <INotificationResult> sources) { ValueChangedNotificationResult <bool> leftChange = null; if (sources.Count >= 1 && sources[0].Source == Left) { leftChange = sources[0] as ValueChangedNotificationResult <bool>; } else if (sources.Count >= 2 && sources[1].Source == Left) { leftChange = sources[1] as ValueChangedNotificationResult <bool>; } if (leftChange != null) { if (leftChange.NewValue) { Right.Successors.Unset(this); } else { Right.Successors.Set(this); } } return(base.Notify(sources)); }
public override INotificationResult Notify(IList <INotificationResult> sources) { var oldValue = value; KeyValuePair <TItem, TKey>[] newValue = null; var comparer = EqualityComparer <TItem> .Default; using (var en = source.KeyedItems.GetEnumerator()) { for (int i = 0; i < X; i++) { if (en.MoveNext()) { if (value.Length <= i || !comparer.Equals(value[i].Key, en.Current.Key)) { if (newValue == null) { newValue = new KeyValuePair <TItem, TKey> [X]; Array.Copy(value, 0, newValue, 0, i); } newValue[i] = en.Current; } else if (newValue != null) { newValue[i] = en.Current; } } else { if (value.Length == i) { return(UnchangedNotificationResult.Instance); } else if (newValue == null) { newValue = new KeyValuePair <TItem, TKey> [i]; Array.Copy(value, 0, newValue, 0, i); break; } else { Array.Resize(ref newValue, i); break; } } } } if (newValue != null) { var e = new ValueChangedNotificationResult <KeyValuePair <TItem, TKey>[]>(this, value, newValue); value = newValue; OnValueChanged(oldValue, newValue); return(e); } else { return(UnchangedNotificationResult.Instance); } }
private void NotifyInnerKey(ValueChangedNotificationResult <TKey> keyChange, List <TResult> replaceAdded, List <TResult> replaceRemoved) { var value = (TaggedObservableValue <TKey, TInner>)keyChange.Source; var group = groups[keyChange.OldValue]; group.InnerKeys.Remove(value); if (group.InnerKeys.Count == 0) { replaceRemoved.AddRange(group.OuterElements.Values.Select(r => r.Value)); } if (!groups.TryGetValue(value.Value, out group)) { group = new KeyGroup(); groups.Add(value.Value, group); } group.InnerKeys.Add(value); if (group.InnerKeys.Count == 1) { replaceAdded.AddRange(group.OuterElements.Values.Select(r => r.Value)); } }
private void NotifyInnerKey(ValueChangedNotificationResult <TKey> keyChange, List <TResult> replaceAdded, List <TResult> replaceRemoved) { var value = (TaggedObservableValue <TKey, TInner>)keyChange.Source; var group = groups[keyChange.OldValue]; group.InnerKeys.Remove(value); foreach (var outer in group.OuterKeys) { replaceRemoved.Add(DetachResult(group, outer.Tag, value.Tag)); } if (!groups.TryGetValue(value.Value, out group)) { group = new KeyGroup(); groups.Add(value.Value, group); } group.InnerKeys.Add(value); foreach (var outer in group.OuterKeys) { replaceAdded.Add(AttachResult(group, outer.Tag, value.Tag)); } }