On Tue, Dec 10, 2013 at 10:57 AM, "Nordlöw" <per.nord...@gmail.com> wrote: > I'm looking for an elegant way to perform chunk-stream-based processing of > arrays/ranges. I'm building a file indexing/search engine in D that > calculates various kinds of statistics on files such as histograms and > SHA1-digests. I want these calculations to be performed in a single pass > with regards to data-access locality.
> Seemingly this is not a very elegant (functional) approach as I have to > spread logic for each statistics (reducer) across three different places in > the code, namely `start`, `put` and `finish`. Concerning the put, you could have an auxiliary function that's defined only once: void delegate( /*typeofChunk?*/ chunk) worker, sha, bhist8; if (doSHA1) sha = (chunk) { sha1.put(chunk);} else sha = (chunk) {} if (doBhist8) bhist8 = (chunk) { /*some BHist8 work*/} else bhist8 = (chunk) {} worker = (chunk) { sha(chunk); bist8(chunk};} ... foreach (chunk; src.chunks(chunkSize)) worker(chunk);