copy method

System<State, Event> copy(
  1. CopyRun<State, Event> copy
)

Create a new system based on current one.

Return a redefined system by copy a new one with custom logic. The concept is similar to middleware or interceptor.

This is a low level operator, we can use it to supporting other operators like runWithContext, onDispose.

API Overview

system
  .copy((run) => ({reduce, effect, interceptor}) {
    final _reduce = _redefineReduce(reduce); // redefine reduce if needed
    final _effect = _redefineEffect(effect); // redefine effect if needed
    final _interceptor = _redefineInterceptor(interceptor); // redefine interceptor if needed
    final disposer = run(reduce: _reduce, effect: _effect, interceptor: _interceptor);
    final _disposer = _redefineDisposer(disposer) // redefine disposer if needed
    return _disposer;
  })
  ...

Usage Example

Below code showed how to create an operator onDispose which register a dispose callback into system

System<State, Event> onDispose({
  required void Function() run
}) => copy((_run) => ({reduce, effect, interceptor}) {
  final disposer = Disposer(run);
  final sourceDisposer = _run(reduce: reduce, effect: effect, interceptor: interceptor);
  return Disposer(() {
    sourceDisposer();
    disposer();
  });
});

It redefined the disposer and register the dispose callback

Usage of system.onDispose:


final controller = SomeController(); // somewhere within same scope

...

system
  ...
  .onDispose(
    run: () => controller.dispose(),
  )
  ...

Above code will dispose controller if system is disposing.

Implementation

System<State, Event> copy(
  CopyRun<State, Event> copy
) {
  final next = copy(_run);
  return System.pure(next);
}