How to get type returned by e.g. std.algorithm.iteration.filter
Christian Köstlin
christian.koestlin at gmail.com
Sun May 19 20:57:20 UTC 2019
Last version using more from the outer template
#!/usr/bin/env rdmd
import std.stdio;
import std.algorithm;
import std.typecons;
import std.array;
import std.range;
import std.traits;
auto byMinimum(Ranges)(Ranges ranges)
{
auto getNonEmpty()
{
return ranges.filter!("!a.empty");
}
auto nonEmpty = getNonEmpty;
auto minimumOfRanges()
{
// dfmt off
return nonEmpty
.map!(range => tuple!("range", "line")(range, range.front))
.minElement!("a.line");
// dfmt on
}
ReturnType!(minimumOfRanges) minRangeAndLine;
struct ByMinimum
{
bool empty()
{
return nonEmpty.empty;
}
auto front()
{
minRangeAndLine = minimumOfRanges;
return minRangeAndLine;
}
void popFront()
{
nonEmpty = getNonEmpty;
minRangeAndLine.range.popFront;
}
}
return ByMinimum();
}
void main(string[] files)
{
foreach (n; files[1 .. $].map!(name =>
File(name).byLine(No.keepTerminator)).array.byMinimum)
{
writeln(n.line);
}
}
More information about the Digitalmars-d-learn
mailing list