Is there a smart way to process a range of range by front ?

BBasile via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Sep 23 13:48:03 PDT 2015


I was thinking to a general *interleave()* algorithm for any 
compatible Range of Range but I can't find any smart way to 
process each sub range by front, eg:

---
void interleave(RoR)(RoR r)
{
    r.each!(a => a.writeln);
}

void main()
{
     auto r = [[0,2],[1,3]];
     interleave(r);
}
---

will print:
[0,2]
[1,3]

while to interleave i need to take the front of each sub range 
before poping each ror element.

Currently I'm here (don't run this ;)) :

---
auto interleave(RoR)(RoR r)
{
     alias T = ElementType!r[0];
     T[] result;
     while (!empty(r[0]))
         r.each!(a => (result ~= a.front, a.popFront));
     return result;
}

void main()
{
     auto r = [[0,2],[1,3]];
     interleave(r);
}
---

but it doesn't work because 'a' is not consumed. It looks like 
it's saved from the input parameter at each iteration of the 
while loop hence it never returns.

Is it possible ?


More information about the Digitalmars-d-learn mailing list