Merging one Array with Another

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 1 21:08:02 PDT 2015


On 05/01/2015 06:39 PM, "Per =?UTF-8?B?Tm9yZGzDtnci?= 
<per.nordlow at gmail.com>" wrote:> On Friday, 1 May 2015 at 22:47:17 UTC, 
Ali Çehreli wrote:
 >> It is about the uniqueness of consecutive elements. It says "unique
 >> consecutive elements".
 >>
 >> Ali
 >
 > Ah.
 >
 > Then I guess that if input is SortedRange then SortedRange should be
 > returned.

Interesting idea. I have defined a simple algorithm below to see how it 
could work (my skipped() function instead of uniq()).

import std.stdio;
import std.range;
import std.algorithm;
import std.exception;

struct Skipper(R)
{
     R range;

     this(R range)
     {
         enforce(range.length % 2 == 0,
                 "This example requires even number of elements");
         this.range = range;
     }

     @property bool empty() { return range.empty; }
     @property auto front() { return range.front; }

     void popFront()
     {
         range.popFront();
         range.popFront();
     }
}

auto skipped(R)(R range)
{
     import std.traits;

     static if (isInstanceOf!(SortedRange, R)) {
         // Nice! Let's add an .assumeSorted at the end
         return Skipper!R(range).assumeSorted;

     } else {
         return Skipper!R(range);
     }
}

void use(R)(R range)
{
     pragma(msg, R);
     writeln(range);
     writeln();
}

void main()
{
     auto a = [ 1, 2, 3, 4, 5, 6 ];

     use(a.skipped);
     use(a.assumeSorted.skipped);
}

Prints at compile time:

Skipper!(int[])
SortedRange!(Skipper!(SortedRange!(int[], "a < b")), "a < b")

Prints at run time:

[1, 3, 5]

[1, 3, 5]


One issue is that many standard algorithms could benefit from this as 
well. Should it be only for SortedRange? What about user defined 
types... What if I wanted MyCoolRange to be appended automatically as 
.myCoolRange. Could there we standard mechanism to support any range type?

Maybe the answer is a helper mixin that defines a template 
specialization for SortedRange!(R2, Func) instead of my 'static if' 
solution. (I was too impatient to get that syntax right. :) )

Ali



More information about the Digitalmars-d-learn mailing list