bool Disconnect(TKey correlationId, IPipelineSink <T> sink) { return(_output.Set(sinks => { CorrelatedMessageSinkRouter <T, TMessage, TKey> keySink; if (sinks.TryGetValue(correlationId, out keySink) == false) { return sinks; } var result = new Dictionary <TKey, CorrelatedMessageSinkRouter <T, TMessage, TKey> >(sinks); List <IPipelineSink <T> > outputSinks = keySink.Sinks.Where(x => x != sink).ToList(); if (outputSinks.Count == 0) { result.Remove(correlationId); } else { result[correlationId] = new CorrelatedMessageSinkRouter <T, TMessage, TKey>(correlationId, outputSinks); } return result; }) != null); }
public UnsubscribeAction Connect(TKey correlationId, IPipelineSink <T> sink) { _output.Set(sinks => { CorrelatedMessageSinkRouter <T, TMessage, TKey> keySink; if (sinks.TryGetValue(correlationId, out keySink) == false) { keySink = new CorrelatedMessageSinkRouter <T, TMessage, TKey>(correlationId); keySink.Connect(sink); return(new Dictionary <TKey, CorrelatedMessageSinkRouter <T, TMessage, TKey> >(sinks) { { correlationId, keySink } }); } var result = new Dictionary <TKey, CorrelatedMessageSinkRouter <T, TMessage, TKey> >(sinks); keySink = new CorrelatedMessageSinkRouter <T, TMessage, TKey>(correlationId, keySink.Sinks); keySink.Connect(sink); result[correlationId] = keySink; return(result); }); return(() => Disconnect(correlationId, sink)); }