copy method
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);
}