public static IReactiveSet <KeyValuePair <TKey, TValue> > ToSet <TKey, TValue>(this IReactiveDictionary <TKey, TValue> dict) { return(dict.AsObservable().SelectMany(changes => changes.SelectMany(change => { if (change.ChangeReason == ReactiveDictionaryChangeReason.AddOrUpdate) { if (dict.TryGetValue(change.Key, out var oldValue)) { // Updating, so remove the old pair and add the new one return new[] { new ReactiveSetChange <KeyValuePair <TKey, TValue> >( ReactiveSetChangeReason.Remove, new[] { new KeyValuePair <TKey, TValue>(change.Key, oldValue) } ), new ReactiveSetChange <KeyValuePair <TKey, TValue> >( ReactiveSetChangeReason.Add, new[] { new KeyValuePair <TKey, TValue>(change.Key, change.Value) } ) }; } } // Just adding or removing return new[] { new ReactiveSetChange <KeyValuePair <TKey, TValue> >( change.ChangeReason == ReactiveDictionaryChangeReason.AddOrUpdate ? ReactiveSetChangeReason.Add : ReactiveSetChangeReason.Remove, new[] { new KeyValuePair <TKey, TValue>(change.Key, change.Value) } ) }; })) .ToReactiveSet(pair => dict.TryGetValue(pair.Key, out var value) && value.Equals(pair.Value))); }
public static IReactiveDictionary <TKey, TValue> Where <TKey, TValue>(this IReactiveDictionary <TKey, TValue> dict, Func <TKey, TValue, bool> selector) { return(dict .AsObservable() .Select(changes => changes .Select(change => { if (change.ChangeReason == ReactiveDictionaryChangeReason.AddOrUpdate && !selector(change.Key, change.Value)) { if (dict.TryGetValue(change.Key, out var value)) { return new ReactiveDictionaryChange <TKey, TValue>(change.Key, value, ReactiveDictionaryChangeReason.Remove); } else { return null; } } else { return change; } }) .Where(x => x != null) .ToArray() ) .Where(x => x.Any()) .ToDictionary((TKey key, out TValue value) => { if (!dict.TryGetValue(key, out value)) { return false; } return selector(key, value); })); }
public static IReactiveDictionary <TKey, TNewValue> SelectEquatable <TKey, TValue, TNewValue>( this IReactiveDictionary <TKey, TValue> dict, Func <TKey, TValue, TNewValue> selector) where TNewValue : IEquatable <TNewValue> { return(dict.AsObservable().Select(changes => changes.Select(change => { if (change.ChangeReason == ReactiveDictionaryChangeReason.AddOrUpdate) { return new ReactiveDictionaryChange <TKey, TNewValue>(change.Key, selector(change.Key, change.Value), ReactiveDictionaryChangeReason.AddOrUpdate); } else if (dict.TryGetValue(change.Key, out var value)) { return new ReactiveDictionaryChange <TKey, TNewValue>(change.Key, selector(change.Key, change.Value), ReactiveDictionaryChangeReason.Remove); } else { return null; } })) .ToDictionary((TKey key, out TNewValue value) => { if (dict.TryGetValue(key, out var oldValue)) { value = selector(key, oldValue); return true; } value = default; return false; })); }
public static IReactiveDictionary <TKey, TValue> Join <TKey, TValue>(this IReactiveDictionary <TKey, TValue> dict, IReactiveDictionary <TKey, TValue> dict2) { var obs1 = dict.AsObservable().Select(changes => changes.Select(change => { if (change.ChangeReason == ReactiveDictionaryChangeReason.Remove) { if (dict2.TryGetValue(change.Key, out var value)) { return(new ReactiveDictionaryChange <TKey, TValue>(change.Key, value, ReactiveDictionaryChangeReason.AddOrUpdate)); } } return(change); })); var obs2 = dict2.AsObservable().Select(changes => changes.Select(change => { if (change.ChangeReason == ReactiveDictionaryChangeReason.Remove) { if (dict2.TryGetValue(change.Key, out var value)) { return(new ReactiveDictionaryChange <TKey, TValue>(change.Key, value, ReactiveDictionaryChangeReason.AddOrUpdate)); } } return(change); })); return(obs1.Merge(obs2) .Select(x => x.ToArray()) .Where(x => x.Length > 0) .ToDictionary((TKey key, out TValue value) => { if (dict.TryGetValue(key, out value)) { return true; } return dict2.TryGetValue(key, out value); })); }
public static bool ContainsKey <TKey, TValue>(this IReactiveDictionary <TKey, TValue> dict, TKey key) { return(dict.TryGetValue(key, out _)); }