, int, :
IObservable<IObservable<Func<int, int>>> transformerObservables = null;
IObservable<int> values = null;
,
IObservable<IObservable<Func<int, int>>> -> IObservable<<Func<int, int>>[]>
, , , , Func <... > . , ...
var transformerArrayObservable = transformerObservables
.Select((transformerObservable, index) => transformerObservable
.Select(transformer => Tuple.Create(index, transformer))
.Materialize()
.Scan(new
{
Previous = (Tuple<int, Func<int, int>>)null,
Current = (Tuple<int, Func<int, int>>)null
},
(tuple, currentTransformer) => new
{
Previous = tuple.Current,
Current = currentTransformer.HasValue
? currentTransformer.Value
: (Tuple<int, Func<int, int>>)null
}))
.Merge()
.Scan(
new Tuple<int, Func<int, int>>[0],
(array, tuple) =>
{
var list = array.ToList();
if (tuple.Previous != null)
list.Remove(tuple.Previous);
if (tuple.Current != null)
list.Add(tuple.Current);
return list.ToArray();
})
.Select(x => x.Select(y => y.Item2).ToArray())
.StartWith(Scheduler.Immediate, new[] { new Func<int, int>[0]});
, Rx, CombineVeryLatest. .
var transformedValues = values
.CombineVeryLatest(transformerArrayObservable, (value, transformers) =>
{
return transformers
.Aggregate(value, (current, transformer) => transformer(current));
});
. , , .