On 24.01.15 15:53, Andrei Alexandrescu wrote:
On 1/24/15 4:13 AM, zeljkog wrote:
On 24.01.15 12:50, Peter Alexander wrote:
auto f = unique();
[1, 5, 5, 2, 1, 5, 6, 6].filter!(f).writeln;  // [1, 5, 2, 6]

Filter needs an alias, and you cannot alias an R-value (it has no
symbol).

Yes, I see :)

But I think this should be supported by std.algorithm:

import std.stdio, std.algorithm;

struct Uniq{
     bool[int] c;
     bool opCall(int a){
         if (a in c)
             return false;
         else{
             c[a] = true;
             return true;
         }
     }
}

void main()
{
     [1, 5, 5, 2, 1, 5, 6, 6].filter!Uniq.writeln;
}

I can't make sense of this - where is Uniq supposed to be instantiated?
-- Andrei


Require following changes in std.algorithm.filter.

original:

template filter(alias predicate) if (is(typeof(unaryFun!predicate)))
{
    auto filter(Range)(Range range) if (isInputRange!(Unqual!Range))
    {
        return FilterResult!(unaryFun!predicate, Range)(range);
    }
}

private struct FilterResult(alias pred, Range)
...

changed (to run this case):

template filter(alias predicate) if (is(typeof(unaryFun!predicate)))
{
    auto filter(Range)(Range range) if (isInputRange!(Unqual!Range))
    {
        static if (is(predicate == struct))
            return FilterResult!(predicate, Range)(range);
        else
            return FilterResult!(unaryFun!predicate, Range)(range);
    }
}

private struct FilterResult(alias predicate, Range)
{
    static if (is(predicate == struct))
        predicate pred;
    else
        alias pred = predicate;
...


Reply via email to