Fork me on GitHub

Is there some good write up somewhere of how reduce is internally implemented in Clojure? Or a summary at least of why there are interface IReduce, IReduceInit, and also CollReduce and InternalReduce? Even just a few sentences summarizing why these all exist might be clarifying.


CollReduce is the main protocol


IReduce/IReduceInit are Java interfaces that allow you to hook into the reduce protocol if you are directly implementing them


InternalReduce is implementation details


if you're writing a concrete Clojure thing, extend CollReduce. if you're writing some kind of low level Java thing like a data structure that you want to be reducible, implement IReduceInit at least, or IReduce if you want


Do you have an example of a concrete Clojure thing that should extend CollReduce, that is not some kind of low level Java thing? e.g. is a Clojure deftype class such a thing that should extend CollReduce?


things like custom map impls for example