Timon Gehr:

mixin ADT!q{ Tree(T): Leaf(T x), Node(Tree a, Tree b) };

DynRange!T fringe(T)(Tree!T t){
    return t.match!(
        (Leaf l) => cons(l.x, empty),
        (Node n) => chain(n.a.fringe, n.b.fringe).dynRange,
    );
}

bool sameFringe(T)(Tree!T t1, Tree!T t2){
    return equal(t1.fringe, t2.fringe);
}

for suitable definitions of ADT, DynRange/dynRange, cons and empty. So those would be nice additions to Phobos. Obviously this would look even
better:

mixin ADT!q{ Tree(T): Leaf(T x), Node(Tree a, Tree b) };

DynRange!T fringe(T)(Tree!T t) => t.match!(
    (Leaf l) => cons(l.x, empty),
    (Node n) => chain(n.a.fringe, n.b.fringe).dynRange,
);

bool sameFringe(T)(Tree!T t1, Tree!T t2) => t1.fringe == t2.fringe;

And thank you for the code example.

Bye,
bearophile

Reply via email to