Possible improvement of phobos map?
JG
someone at somewhere.com
Mon Jul 4 19:44:11 UTC 2022
Hi,
There was a recent discussion regarding suggesting some special
algorithms for associative arrays, which made we wonder if the
problem isn't actually that it is a slightly annoying when
working with ranges of tuples or structs.
For instance you might have code like this
```d
auto a = ["a":5, "b":6];
a.byPair.map!(t=>format!"%s=%s"(t[0],t[1])).writeln;
```
or
```d
auto r = iota(1,10);
auto gcds = cartesianProduct(r,r).map!(t=>gcd(t[0],t[1]));
```
which while not too bad isn't as readable as it could be, and it
gets worse when the chain gets longer.
With some slight changes to map (which wouldn't be needed if
pattern matching exists), one can do this:
```d
import std;
struct MapPrototype(alias f, R) {
R r;
bool empty() { return r.empty; }
auto front() { return f(r.front.tupleof); }
void popFront() { r.popFront; }
auto save() { return typeof(this)(r.save); }
}
auto mapPrototype(alias f, R)(R r) {
return MapPrototype!(f,R)(r);
}
struct Point {
int x;
int y;
}
void main() {
auto r = iota(1,10);
auto gcds = cartesianProduct(r,r).mapPrototype!(gcd);
gcds.writeln;
auto a = ["a":5, "b":6];
a.byPair.mapPrototype!((name,value)=>format!"%s=%s"(name,value)).writeln;
[Point(1,2),Point(3,4)].mapPrototype!((x,y)=>x*x+y*y).writeln;
}
```
Thoughts?
More information about the Digitalmars-d
mailing list