Ejemplo n.º 1
0
        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)));
        }
Ejemplo n.º 2
0
        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);
            }));
        }
Ejemplo n.º 3
0
        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;
            }));
        }
Ejemplo n.º 4
0
        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);
            }));
        }
Ejemplo n.º 5
0
 public static bool ContainsKey <TKey, TValue>(this IReactiveDictionary <TKey, TValue> dict, TKey key)
 {
     return(dict.TryGetValue(key, out _));
 }