wabbajack/Wabbajack.App/Extensions/IObservableExtensions.cs

58 lines
1.8 KiB
C#
Raw Normal View History

2021-09-27 12:42:46 +00:00
using System;
2021-11-02 13:40:59 +00:00
using System.Linq.Expressions;
2021-09-27 12:42:46 +00:00
using System.Reactive.Disposables;
2021-11-02 13:40:59 +00:00
using System.Reactive.Linq;
2021-09-27 12:42:46 +00:00
using System.Reactive.Subjects;
using System.Threading.Tasks;
2021-11-02 13:40:59 +00:00
using Microsoft.CodeAnalysis.CSharp.Syntax;
using ReactiveUI;
2021-09-27 12:42:46 +00:00
2021-10-23 16:51:17 +00:00
namespace Wabbajack.App.Extensions;
public static class IObservableExtensions
2021-09-27 12:42:46 +00:00
{
2021-10-23 16:51:17 +00:00
public static IObservable<TOut> SelectAsync<TIn, TOut>(this IObservable<TIn> input,
CompositeDisposable disposable,
Func<TIn, ValueTask<TOut>> func)
2021-09-27 12:42:46 +00:00
{
2021-10-23 16:51:17 +00:00
Subject<TOut> returnObs = new();
2021-09-27 12:42:46 +00:00
2021-10-23 16:51:17 +00:00
input.Subscribe(x => Task.Run(async () =>
{
var result = await func(x);
returnObs.OnNext(result);
})).DisposeWith(disposable);
2021-09-27 12:42:46 +00:00
2021-10-23 16:51:17 +00:00
return returnObs;
2021-09-27 12:42:46 +00:00
}
2021-11-02 13:40:59 +00:00
public static IDisposable SimpleOneWayBind<TView, TViewModel, TProp, TOut>(
this TView view,
TViewModel? viewModel,
Expression<Func<TViewModel, TProp?>> vmProperty,
Expression<Func<TView, TOut?>> viewProperty)
where TView : class
{
var d = viewModel.WhenAny(vmProperty, change => change.Value)
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(view, viewProperty);
return Disposable.Create(() => d.Dispose());
}
public static IDisposable SimpleOneWayBind<TView, TViewModel, TProp, TOut>(
this TView view,
TViewModel? viewModel,
Expression<Func<TViewModel, TProp?>> vmProperty,
Expression<Func<TView, TOut?>> viewProperty,
Func<TProp?, TOut> selector)
where TView : class
{
var d = viewModel.WhenAnyValue(vmProperty)
.Select(change => selector(change))
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(view, viewProperty);
return Disposable.Create(() => d.Dispose());
}
2021-09-27 12:42:46 +00:00
}