import std.algorithm: filter;
import std.range: iota, ElementType;
struct Map(alias mapper, Range) {
alias MappedType = typeof(mapper(ElementType!Range.init));
size_t resolvedIndex = 0;
private this(T : Range)(auto ref T range) {
scope(exit) this.currentIndex++;
if (this.currentIndex == this.resolvedIndex) return;
this.value = mapper(this.range.front);
this.resolvedIndex = this.currentIndex;
auto map(alias mapper, Range)(auto ref Range range) {
return Map!(mapper, Range)(range);
.map!((n) { writeln("transform ", n); return n * 2; })
.filter!(n => n % 4 == 0)