toHandler method
Get a HandlerFunction that uses this strategy to forward messages
to the provided messengers
, returning a single answer that may
be either provided by one of the given messengers, or computed
by combining in some way the answers given by the messengers.
Implementation
@override
HandlerFunction<M, A> toHandler(List<Messenger<M, A>> messengers) {
if (messengers.length < minAnswers) {
throw ArgumentError('Cannot create HandlerFunction with '
'messengers.length < minAnswers:'
' (${messengers.length} < $minAnswers)');
}
final handlersToCall = handlersPerMessage ?? messengers.length;
if (messengers.length < handlersToCall) {
throw ArgumentError('Cannot create HandlerFunction with '
'messengers.length < handlersPerMessage:'
' (${messengers.length} < $handlersPerMessage)');
}
return (M message) {
final completer = _MultiCompleter<A>(minAnswers, handlersToCall);
final futures = _pickMessengers(messengers, handlersToCall)
.map((m) => m.send(message));
for (final future in futures) {
if (future is Future<A>) {
future.then(completer.complete, onError: completer.completeError);
}
}
return completer.future.then(combineAnswers);
};
}