Functional Programming Strategies in Scala with Cats