https://blog.leoho.dev/posts/functional-programming-javascript/