Benefits of using pure functions:
- Portable (because it has a clear interface and boundaries)
- Testable (just need to test what goes in and what comes out)
- Easier to reason about (because of clear boundaries)
- Thread safe
- Easy to cache (https://en.wikipedia.org/wiki/Memoization)