Как мне обрабатывать побочные потоки в Rx.Net?
Я строю симуляцию с использованием Rx.Net. Пользовательский ввод моделируется как поток преобразования состояния в исходное состояние. С помощью Scan
Я могу разрешить эти преобразования в текущем состоянии.
Проблема в том, что преобразования могут иметь побочные эффекты. Они моделируются как объекты событий, которые реализуют ISimulationEvent
,
Я попробовал несколько подходов:
- Сохранять побочные эффекты в текущем состоянии объекта и очищать их при каждом преобразовании
- Вернуть
Tuple
игровых состояний иIList<ISimulationEvent>
вScan
- Передайте обратный вызов побочного эффекта, чтобы объединить их
Каждое решение кажется "хакерским".
Есть ли чистый способ реализовать это с помощью Rx.Net?
Это пример того, как мои команды складываются в состояния:
var commands = mouseStates
.DistinctUntilChanged(mouseState => mouseState.LeftButton)
.Where(mouseState => mouseState.LeftButton == ButtonState.Pressed)
.Select(mouseState => new CreateWidgetCommand(new Vector2(mouseState.X, mouseState.Y)));
var initialState = new SimulationState();
var states = commands.Scan(
initialState,
(state, command) => command.CanApply(state) ? command.Apply(state) : state);
каждый Apply
должен вывести поток ISimulationEvent
как побочный эффект. Тем не менее, мне также нужно сохранить результат SimulationState
,