effects method

System<State, Event> effects(
  1. Stream<Event> effects(
    1. Stream<Moment<State, Event>> moments
    )
)

Stream version of add(effect: ).

Moment holds state, oldState and event of that moment. moments is stream of moment when event happen.

This code:

 ...
 .effects((moments) => moments
   .asyncExpand((moment) async* {
     if (moment.event == 520) {
       yield 521;
     }
   })
 );

will produce same result as this:

 ...
 .add(effect: (state, oldState, event, dispatch) {
   if (event == 520) {
     dispatch(521);
   }
 },);

Implementation

System<State, Event> effects(
  Stream<Event> Function(Stream<Moment<State, Event>> moments) effects
) => withContext<_Context<State, Event>>(
  createContext: () => _Context(
    StreamController(),
  ),
  effect: (context, state, oldState, event, dispatch) {
    if (event == null) {
      final events = effects(context.moments.stream);
      context.subscription = events.listen(dispatch.call);
    }
    context.moments.add(Moment(state, oldState, event));
  },
  dispose: (context) {
    context.subscription?.cancel();
    context.subscription = null;
    context.moments.close();
  },
);