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