An FRP application has the following properties
- Functional, pure, immutable.
- Reactive, your application is a DAG, you react to "core" inputs and from new outputs.
If your application is an immutable DAG it has certain properties
- Each conceptual node in the DAG is the sole owner of truth for that information.
- A DAG can be serialized, have time rewound on it, can go through an interactive debugger, etc.
- Parts of your application only change by reacting to input, you know exactly what can cause state changes in any part of your application by looking at which inputs you react to.
The meat of your application, inputs, update, state and render is pure. This means it consists of plain functions that do not do IO nor have effects.
The actual IO or effectful part of your application is completely at the edges of your DAG. This means you can easily test your application because it's just logic. You can easily run your application in a web worker because it's just logic. You can easily do introspection on your application or time rewinding because doing so has no effects.
When building GUI progress with a DAG you can take "raw" input from various sources (events, mouse, keyboard) and convert them into actual logical, well typed "user intents" that are agnostic of the implementation details of your host environment. The same applies for output, you can create a well typed structural representation of your UI and have it be rendered in the host environment.
You get to choose what type of structural representation you want for the visual UI and you get to choose what kind of user intents you want to operate upon. Your application is shielded from the implementation details of the Host environment and they do not corrupt their way into your application.