Skip to content

Commit

Permalink
Feature: Leverage TransformImmutable (#845)
Browse files Browse the repository at this point in the history
* Use TransformImmutable in MergeManyChangeSetsSourceCompare
* Use TransformImmutable in FilterOnObservable
* Use Primary Constructor for helper proxy class
* Re-Enable extra unit tests now that they seem to be passing
  • Loading branch information
dwcullop committed Feb 5, 2024
1 parent 52f1b14 commit fb86420
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ public MergeManyChangeSetsCacheSourceCompareFixture()
[Theory]
[InlineData(5, 7)]
[InlineData(10, 50)]
#if false && !DEBUG
[InlineData(10, 1_000)]
#if !DEBUG
[InlineData(100, 100)]
[InlineData(10, 1_000)]
[InlineData(1_000, 10)]
#endif
public async Task MultiThreadedStressTest(int marketCount, int priceCount)
Expand Down
26 changes: 11 additions & 15 deletions src/DynamicData/Cache/Internal/FilterOnObservable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,19 @@ internal sealed class FilterOnObservable<TObject, TKey>(IObservable<IChangeSet<T
private readonly Func<TObject, TKey, IObservable<bool>> _filterFactory = filterFactory ?? throw new ArgumentNullException(nameof(filterFactory));
private readonly IObservable<IChangeSet<TObject, TKey>> _source = source ?? throw new ArgumentNullException(nameof(source));

public IObservable<IChangeSet<TObject, TKey>> Run() => _source.Transform((val, key) => new FilterProxy(val, _filterFactory(val, key)))
.AutoRefreshOnObservable(proxy => proxy.FilterObservable, buffer, scheduler)
.Filter(proxy => proxy.PassesFilter)
.Transform(proxy => proxy.Value);

private sealed class FilterProxy
public IObservable<IChangeSet<TObject, TKey>> Run() =>
_source
.Transform((val, key) => new FilterProxy(val, _filterFactory(val, key)))
.AutoRefreshOnObservable(proxy => proxy.FilterObservable, buffer, scheduler)
.Filter(proxy => proxy.PassesFilter)
.TransformImmutable(proxy => proxy.Value);

private sealed class FilterProxy(TObject obj, IObservable<bool> observable)
{
public FilterProxy(TObject obj, IObservable<bool> observable)
{
Value = obj;
FilterObservable = observable.DistinctUntilChanged().Do(filterValue => PassesFilter = filterValue);
}

public IObservable<bool> FilterObservable { get; }

public TObject Value { get; }
public TObject Value { get; } = obj;

public bool PassesFilter { get; private set; }

public IObservable<bool> FilterObservable => observable.DistinctUntilChanged().Do(filterValue => PassesFilter = filterValue);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ internal sealed class MergeManyCacheChangeSetsSourceCompare<TObject, TKey, TDest
.Subscribe();
return new CompositeDisposable(shared.Connect(), subMergeMany, subParent);
}).Select(changes => changes.Transform(entry => entry.Child));
}).TransformImmutable(entry => entry.Child);

private sealed class ParentChildEntry(TObject parent, TDestination child)
{
Expand Down

0 comments on commit fb86420

Please sign in to comment.