On Saturday, 15 August 2015 at 10:06:13 UTC, Joseph Rushton
Wakeling wrote:
...
In some cases we're going to want true laziness of evaluation,
but _not_ transience of .front. In these cases, the _first_
time .front is called, its value should be freshly evaluated;
but thereafter, the value is cached, until .popFront() is
called, at which point .front will be re-evaluated lazily the
next time it's called. Something like std.algorithm.cache is
inappropriate here, precisely because it's eager in its
calculation of the cached values.
...
-- Joe
Do you mean something like that:
```d
struct Range
{
public:
enum empty = false;
auto ref front() @property
{
if(mustBeEvaluated)
{
cache = fun();
mustBeEvaluated = false;
}
return cache;
}
void popFront()
{
mustBeEvaluated = true;
}
private:
ReturnType!fun cache;
bool mustBeEvaluated = true;
}
```
?