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?
sure
things like custom map impls for example