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.
I couldn't figure out how to build this using Phobos
primitives, so I wrote my own implementation of it. Pretty
simple, really, it's just a wrapper struct that lazily
initializes an array of Nullable!T and lazily populates it with
func(j) when opIndex(j) is invoked, and just returns the cached
value if opIndex(j) has been invoked before.
Can this be done using current Phobos primitives?
T
Unless I'm misunderstanding your requirements, are you looking
for std.functionl.memoize?
auto fun(int a) {
writeln("here");
return a + 1;
}
void main() {
auto a = [1, 2, 3];
auto b = a.map!(memoize!fun);
writeln(b[1]);
writeln(b[1]);
writeln(b[1]);
}
will print "here" just once.