On Friday, 9 March 2018 at 19:41:46 UTC, H. S. Teoh wrote:
Today I found myself needing a lazy, caching version of map() on an array. More precisely, given an array `T[] src` of source data and a function func(T) that's pretty expensive to compute, return an object `result` such that:

- result[i] == func(src[i]), for 0 ≤ i < src.length.

- If result[j] is never actually used, func(src[j]) is never invoked
  (lazy).

- If result[j] is referenced multiple times, a cached value is returned after the first time, i.e., the result of func(src[j]) is cached, and
  func(src[j]) is never invoked more than once.

Can this be done using current Phobos primitives?


T

Phobos implementation based on memoize would use hash map internally, which is slow for this use case.

mir-algorithm v0.9.5 (DUB would be updated soon) got `cached` and `cachedGC` topologies.

Example:

// Mir's map is required
import mir.ndslice: cachedGC, map, sliced;

auto ar = new int[5];
// init ar ...
auto cachedLazyMap = ar.map!fun.cachedGC;

`cachedGC` [1] internally allocates a vector of caches and a packed bitarray.

`cached` [2] allows to reuse already allocated buffers.

The result support all random access range primitive, slicing and etc.

ndslice architecture allows to add new random access topologies very easily.

[1] http://docs.algorithm.dlang.io/latest/mir_ndslice_topology.html#.cachedGC [2] http://docs.algorithm.dlang.io/latest/mir_ndslice_topology.html#.cached

Best regards,
Ilya Yaroshenko

Reply via email to