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.

Alex Miller (Clojure team)05:01:38

CollReduce is the main protocol

Alex Miller (Clojure team)05:01:11

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

Alex Miller (Clojure team)05:01:26

InternalReduce is implementation details

Alex Miller (Clojure team)05:01:48

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?

Alex Miller (Clojure team)14:01:08

things like custom map impls for example