On Friday, 7 August 2015 at 14:30:55 UTC, Nordlöw wrote:
Any suggestions on adding support for `binaryFun!pred` aswell?

I cracked it.

template isSortedRange(T, alias pred = "a < b")
{
    import std.traits : TemplateArgsOf;

    static if (TemplateArgsOf!T.length == 2)
    {
        import std.functional : binaryFun;

        alias predArg = TemplateArgsOf!T[1];
        static if (isSomeString!(typeof(pred)))
        {
            alias predFun = binaryFun!pred;
        }
        else
        {
            alias predFun = pred;
        }

        static if (isSomeString!(typeof(predArg)))
        {
            alias predArgFun = binaryFun!predArg;
        }
        else
        {
            alias predArgFun = predArg;
        }

enum isSortedRange = (is(T == SortedRange!Args, Args...) && is(typeof(predFun) == typeof(predArgFun)));
    }
    else
    {
        enum isSortedRange = false;
    }
}

///
unittest
{
    import std.functional : binaryFun;

    alias R = int[];
    enum pred = "a < b";

    alias SR = SortedRange!(R, pred);
    static assert(isSortedRange!(SR, pred));
    static assert(isSortedRange!(SR, binaryFun!pred));

    alias SR2 = SortedRange!(R, binaryFun!pred);
    static assert(isSortedRange!(SR2, pred));
    static assert(isSortedRange!(SR2, binaryFun!pred));
}

Comments, please.

Reply via email to