toHandler method

  1. @override
HandlerFunction<M, A> toHandler(
  1. List<Messenger<M, A>> messengers
)
override

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