Clarifications
I am talking about Reactive Programming "in the small". This is a programming paradigm closely related to Functional Programming: the world where concepts like Stream.of(3) (creates a stream that emits the single value 3, then completes) and Stream.never() (creates a stream that never emits a value) are useful concepts, similar to how Sequence.empty() is useful. I am not talking about what could be called "Reactive Systems Architecture", where we are worried about sharded databases and elastic server allocations, where it makes sense for each actor to keep its own copy of all the data it needs to do its job, and where we wouldn't expect the concept to recursively apply to smaller and smaller problems.
This question is probing the limits of the Reactive Programming paradigm. Mature programming paradigms don't have artificial floors and ceilings below and above which they stop providing their benefits. If we heard "Object-Oriented programming no longer works as a concept if your inheritance tree is deeper than 2 levels" we would rightly scoff, just as if we heard "Functional programming doesn't work if you're trying to use it inside another function". Concepts from those paradigms apply recursively: I have the full power of functional programming even inside functions inside functions.
Yet, in reactive programming I'm finding that I'm losing the benefit of the entire paradigm when some seemingly simple constraints apply:
I don't know how many child streams to wire up until after I've seen a value from a parent stream.
Some child streams can emit signals that will logically cause the parent stream to emit a new value.
If your answer is "this is not what Reactive Programming is for", then I don't see how the paradigm is salvageable if it's not recursively applicable. If I encounter a problem and solve it using streams (this is what FancyControl is supposed to be), I want to be able to use my solution if I encounter that same problem again "inside of" another stream. Saying I can't do that is like saying I can't use functional programming concepts inside another function.
If you're getting hung up on FancyControl, please consider the more concrete example of Dropdown:.
Dropdown: (currentValue: Stream id, possibleValues: Stream Collection (id, model)) => {
newValue: Stream id,
htmlNodes: Stream virtualHtmlNode
}
Dropdown is not subscribing to anything, it's just a way to construct a pair of related output streams from a pair of related input streams. When the htmlNodes are eventually rendered to the screen, they provide a way for the user to cause newValue to emit a value. If I need to wire up n dropdowns, where I don't know n until I see a composite pass through some parent stream (condition 1), and some possibleValues streams may depend on this new value and other parts of the composite (condition 2), I appear to hit a floor below which reactive programming concepts no longer provide any benefit.