Implementing a reusable mini-firewall using transducers
Clojure's unique way of describing data transformations, reminiscent of its Lisp and functional heritage, has set a new standard in the art of designing highly expressive algorithms.
Clojure makes you address your problems in terms of highly declarative multi-stage transformations, and more often than not, you'll find your self alternating map
, reduce
, filter
, and likely operations on the powerful seq
abstraction to express the solution you came with as if you were explaining it in plain English to some non IT-savvy person. This declarative way of thinking yields much expressive power, and just looking at how SQL is ruling the database industry nowadays confirms that.
But there was room for improvement in what Clojure provided for defining compoundable data transformations. First of all, the transformations you were writing were not reusable. Indeed, you'd catch yourself writing the same map
operations over and over again, for instance...