Я работаю в Unity на С#, используя плагин UniRX. Для тех, кто не знаком с ним, UniRX — это реализация расширения C# Reactive, перенесенного обратно в C# .Net 2 (это то, что Unity использует с версии 5.3.5). То, что я пытаюсь сделать, это взять данные из одного IObservable типа A, преобразовать их с помощью System.Func и автоматически опубликовать результат в новом IObservable типа B. Я написал несколько строк кода, чтобы сделать это, но я чувствую, что это должно быть что-то, что просто автоматически включается в расширение Reactive (но я просто не смог найти правильный метод для вызова в документации). Код, который я написал, выглядит следующим образом:
private class ObserverableBridge<TIn, TOut> {
public ReactiveProperty<TOut> outStream;
public ObserverableBridge(IObservable<TIn> input, System.Func<TIn, TOut> converter) {
this.outStream = new ReactiveProperty<TOut>();
input.Subscribe((inValue) => this.outStream.Value = converter(inValue));
}
}
public static IObservable<TOut> Bridge<TIn, TOut>(this IObservable<TIn> a, System.Func<TIn, TOut> converter) {
return new ObserverableBridge<TIn, TOut>(a, converter).outStream;
}
Который можно использовать следующим образом:
ReactiveProperty<float> input = new ReactiveProperty<float>(0.1f);
IObservable <int> output = input.Bridge((inFloat) => Mathf.RoundToInt(inFloat));
output.Subscribe((a) => { Debug.Log("a = " + a); });
for(int i = 1; i<3; i++) {
input.Value = i + 0.1f;
}
И производит вывод, например:
a = 0
a = 1
a = 2
Что мне интересно, есть ли способ сделать это встроенным в Reactive Extension (мне кажется, что он должен быть), чтобы мне не нужно было использовать мою собственную систему Bridge.
Заранее спасибо за вашу помощь!