Use IDeclarativeProperty instead of IObservable
This commit is contained in:
36
src/Library/DeclarativeProperty/CombineAllProperty.cs
Normal file
36
src/Library/DeclarativeProperty/CombineAllProperty.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
namespace DeclarativeProperty;
|
||||
|
||||
public class CombineAllProperty<T, TResult> : DeclarativePropertyBase<TResult>
|
||||
{
|
||||
private readonly List<IDeclarativeProperty<T>> _sources;
|
||||
private readonly Func<IEnumerable<T>, Task<TResult?>> _combiner;
|
||||
|
||||
public CombineAllProperty(
|
||||
IEnumerable<IDeclarativeProperty<T>> sources,
|
||||
Func<IEnumerable<T>, Task<TResult?>> combiner,
|
||||
Action<TResult?>? setValueHook = null) : base(setValueHook)
|
||||
{
|
||||
var sourcesList = sources.ToList();
|
||||
_sources = sourcesList;
|
||||
_combiner = combiner;
|
||||
|
||||
var initialValueTask = _combiner(sourcesList.Select(p => p.Value));
|
||||
initialValueTask.Wait();
|
||||
SetNewValueSync(initialValueTask.Result);
|
||||
|
||||
foreach (var declarativeProperty in sourcesList)
|
||||
{
|
||||
AddDisposable(declarativeProperty.Subscribe(OnSourceChanged));
|
||||
}
|
||||
}
|
||||
|
||||
private async Task OnSourceChanged(T? arg1, CancellationToken arg2) => await Update();
|
||||
|
||||
private async Task Update()
|
||||
{
|
||||
var values = _sources.Select(p => p.Value);
|
||||
var result = await _combiner(values);
|
||||
|
||||
await SetNewValueAsync(result);
|
||||
}
|
||||
}
|
||||
@@ -93,4 +93,10 @@ public static class DeclarativePropertyExtensions
|
||||
|
||||
public static IDeclarativeProperty<T> Switch<T>(this IDeclarativeProperty<IDeclarativeProperty<T>?> from)
|
||||
=> new SwitchProperty<T>(from);
|
||||
|
||||
public static IDeclarativeProperty<TResult?> CombineAll<T, TResult>(
|
||||
this IEnumerable<IDeclarativeProperty<T>> sources,
|
||||
Func<IEnumerable<T>, Task<TResult>> combiner,
|
||||
Action<TResult?>? setValueHook = null)
|
||||
=> new CombineAllProperty<T,TResult?>(sources, combiner, setValueHook);
|
||||
}
|
||||
Reference in New Issue
Block a user