title: Recursively sending values to combineLatest publisher
body: <p>I came across some unexpected behavior in Combine that i'm hoping someone may be able to explain. I would expect the following code to create an infinite loop, but it actually only runs through the stream once.</p>
  <pre><code>let pub1 = PassthroughSubject&lt;Int, Never&gt;()
  let pub2 = PassthroughSubject&lt;Int, Never&gt;()
  
  pub1
      .handleEvents(receiveOutput: { print(&quot;Received new pub1 value: \($0)&quot;) })
      .combineLatest(pub2)
      .handleEvents(receiveOutput: { print(&quot;Received new combined value: \($0)&quot;) })
      .sink { value in
          print(value)
          pub1.send(value.0)
      }.store(in: &amp;subscriptions)
  
  print(&quot;sending 1&quot;)
  pub1.send(1)
  print(&quot;sending 2&quot;)
  pub2.send(2)
  </code></pre>
  <p>Generates the following output:</p>
  <pre><code>Received new pub1 value: 1
  sending 2
  Received new combined value: (1, 2)
  (1, 2)
  Received new pub1 value: 1
  </code></pre>
  <p>Since the value inside pub1 feeds back into itself I would expect sink to be called over and over. What's interesting is that if I get rid of the combineLatest , then this code will create an infinite loop. Something about the combineLatest operator is preventing it and I have no idea what.</p>
  <p>I also noticed that adding <code>.receive(on: DispatchQueue.main)</code> before or after the <code>combineLatest</code> will also trigger a loop. I guess I'm not understanding something about how threads are handled in Combine. I'm not seeing this non-looping behavior with other operators. For instance <code>merge(with:)</code> will also create a loop, as expected.</p>