https://raw.github.com/psnively/types_vs_tests/master/src/main/scala/Shapeless.scala

If this is equivalent, then in D it was too much easy:


import std.typetuple: allSatisfy, staticIndexOf;

struct Digit(size_t N) { enum uint n = N; }
// No "static foreach", so:
alias Digit!0 _0;
alias Digit!1 _1;
alias Digit!2 _2;
alias Digit!3 _3;
alias Digit!4 _4;
alias Digit!5 _5;
alias Digit!6 _6;
alias Digit!7 _7;
alias Digit!8 _8;
alias Digit!9 _9;

template isDigit(alias T) {
enum isDigit = staticIndexOf!(T, _0,_1,_2,_3,_4,_5,_6,_7,_8,_9) != -1;
}

bool isValid(Digits...)() {
static if (Digits.length != 9 || !allSatisfy!(isDigit, Digits))
        return false;
    else {
        uint total = 0;
        /*static*/ foreach (i, Dig; Digits)
            total += (9 - i) * Dig.n;
        return total % 11 == 0;
    }
}

void main() {
    static assert(!isValid!(_0, _1)());
static assert( isValid!(_3, _4, _5, _8, _8, _2, _8, _6, _5)()); static assert( isValid!(_1, _2, _3, _4, _5, _6, _7, _8, _9)()); static assert(!isValid!(_3, _1, _5, _8, _8, _2, _8, _6, _5)());
    static assert(!isValid!(_3, _4, _5, _8, _8, _2, _8, _6)());
}

Bye,
bearophile

Reply via email to