Functional programming philosophy
Before we jump in to writing code, let's discuss the ideas and motivations behind functional programming.
State and side effects
Programming is significantly easier when we can think of each code component in isolation. This includes types, functions, and methods. If we wrap our mind around every input to these code components and everything that should be output, we can analyze the code easily to ensure that there are no bugs and that it performs well. Every type is created with a certain number of parameters and each method and function in a program has a certain amount of parameters and return values. Normally, we think about these as only input and output, but the reality is that often, there are more parameters. We refer to these extra input and output as a state.
In a more general sense, state is any stored information, however temporary, that can be changed. Let's consider a simple double function:
func double(input: Int) -> Int { return input...