Clojure Cookbook: Recipes for Functional Programming