www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5638] New: Auto-flattening std.range.chain()

http://d.puremagic.com/issues/show_bug.cgi?id=5638

           Summary: Auto-flattening std.range.chain()
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: bearophile_hugs eml.cc



A D2 demo program:


import std.range, std.stdio;
void main() {
    auto c1 = chain([1, 2], [3, 4]);
    writeln(c1);
    writeln(typeid(typeof(c1)));

    auto c2 = chain(c1, [5, 6]);
    writeln(c2);
    writeln(typeid(typeof(c2)));

    auto c3 = chain([1, 2], [3, 4], [5, 6]);
    writeln(c3);
    writeln(typeid(typeof(c3)));
}


It prints, with DMD 2.052:

[1, 2, 3, 4]
std.range.ChainImpl!(int[],int[]).ChainImpl
[1, 2, 3, 4, 5, 6]
std.range.ChainImpl!(ChainImpl!(int[],int[]),int[]).ChainImpl
[1, 2, 3, 4, 5, 6]
std.range.ChainImpl!(int[],int[],int[]).ChainImpl


I suggest to add some simple automatic simplifications to chain(), so c2 has
the same type of c3:

chain(chain(something), r2) ==> chain(something, r2)
chain(r1, chain(something)) ==> chain(r1, something)
chain(chain(something1), chain(something2)) ==> chain(something1, something2)



To perform them chain() just needs to recognize the type of itself among its
iterable arguments and return a chain of the arguments of the sub-chains.

This flattening is useful to speed up the code with complex nested/paired
chainings, like ones coming from recursive algorithms.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 21 2011