diff --git a/src/client/spark_api/api/Update.cs b/src/client/spark_api/api/Update.cs index 7f31478f3..0785e0e3a 100644 --- a/src/client/spark_api/api/Update.cs +++ b/src/client/spark_api/api/Update.cs @@ -719,45 +719,46 @@ namespace bts.api.core { // Constructs a new dictionary so not as cheap as Select on the Update<> type public static IObservable> - Select(this IObservable> src, Func map, Func key) where TKey : IEquatable { - var cache = ImmutableDictionary.Empty; - return src.Select(update => { - var added = update.added.Select(map); - var removed = update.removed.Select(map); - var changes = update.changes.Select(ch => new Change(map(ch.Old), map(ch.New))); - var builder = cache.ToBuilder(); - builder.RemoveRange(removed.Select(key)); - builder.AddRange(added.Select(t => new KeyValuePair(key(t), t))); - foreach (var (o,n) in changes) { - Debug.Assert(key(o).Equals(key(n))); - builder[key(o)] = n; - } - cache = builder.ToImmutable(); + Select(this IObservable> src, Func map, Func key) where TKey : IEquatable => + Observable.Create>(observer => { + var cache = ImmutableDictionary.Empty; + return src.Subscribe(update => { + var added = update.added.Select(map); + var removed = update.removed.Select(map); + var changes = update.changes.Select(ch => new Change(map(ch.Old), map(ch.New))); + var builder = cache.ToBuilder(); + builder.RemoveRange(removed.Select(key)); + builder.AddRange(added.Select(t => new KeyValuePair(key(t), t))); + foreach (var (o, n) in changes) { + Debug.Assert(key(o).Equals(key(n))); + builder[key(o)] = n; + } + cache = builder.ToImmutable(); - return new TableUpdate(cache, added, changes, removed, key); + observer.OnNext(new TableUpdate(cache, added, changes, removed, key)); + }); }); - } // Constructs a new dictionary so not as cheap as Select on the Update<> type public static IObservable> - SelectKeyValue(this IObservable> src, Func map, Func key) where TKey : IEquatable where TKey2 : IEquatable { - var cache = ImmutableDictionary.Empty; - return src.Select(update => { - var added = update.added.Select(map); - var removed = update.removed.Select(map); - var changes = update.changes.Select(ch => new Change(map(ch.Old), map(ch.New))); - var builder = cache.ToBuilder(); - builder.RemoveRange(removed.Select(key)); - builder.AddRange(added.Select(t => new KeyValuePair(key(t), t))); - foreach (var (o,n) in changes) { - Debug.Assert(key(o).Equals(key(n))); - builder[key(o)] = n; - } - cache = builder.ToImmutable(); - - return new TableUpdate(cache, added, changes, removed, key); + SelectKeyValue(this IObservable> src, Func map, Func key) where TKey : IEquatable where TKey2 : IEquatable => + Observable.Create>(observer => { + var cache = ImmutableDictionary.Empty; + return src.Subscribe(update => { + var added = update.added.Select(map); + var removed = update.removed.Select(map); + var changes = update.changes.Select(ch => new Change(map(ch.Old), map(ch.New))); + var builder = cache.ToBuilder(); + builder.RemoveRange(removed.Select(key)); + builder.AddRange(added.Select(t => new KeyValuePair(key(t), t))); + foreach (var (o, n) in changes) { + Debug.Assert(key(o).Equals(key(n))); + builder[key(o)] = n; + } + cache = builder.ToImmutable(); + observer.OnNext(new TableUpdate(cache, added, changes, removed, key)); + }); }); - } public static IObservable> LeftJoin(this IObservable> left_source, IObservable> right_source, Func left_key, Func right_key, TRight right_default = default)