Highly concurrent applications, such as user interfaces, have traditionally managed state through the mutation of global variables. Various actions are coordinated via event handlers, which are procedural in nature.
Over time, the complexity of a system increases. New feature requests come in, and it becomes harder and harder to reason about the application.
Functional programming presents itself as an extremely powerful ally in building reliable systems by eliminating mutable states and allowing applications to be written in a declarative and composable way.
Such principles gave rise to functional Reactive Programming and Compositional Event Systems, programming paradigms that are exceptionally useful in building asynchronous and concurrent applications. They allow you to model mutable states in a functional style.
This book is devoted to these ideas and presents a number of different tools and techniques to help manage the increasing complexity of modern systems.