Andrei Alexandrescu napisał: > Aha, so this encodes the predicate in the operation. With a general > predicate, that would be: > > if (any!"a != b"(expr, 1, 2, 5)) { ... } > > The advantage over > > if (expr != 1 || expr != 2 || expr != 5)) { ... } > > is terseness and the guarantee that expr is evaluated once (which is > nice at least for my code).
Yes. > This looks promising and well integrated with the rest of Phobos. Should > I add it? Please do. Oh, thinking about it 10 more minutes, an improvement struck me: bool any(alias pred = "a==b", E, Ts...)(E e, Ts args) if(Ts.length > 1 || !isTuple!Ts) { foreach (a; args) if (binaryFun!pred(a, e)) return true; return false; } unittest { assert(!"abac".any("s")); assert(!"abac".any("aasd", "s")); assert("abac".any("aasd", "abac", "s")); } /// Unpacks a single tuple. bool any(alias pred = "a==b", E, T)(E e, T t) if(isTuple!T) { return any!(pred, E, T.Types)(e, t.field); } unittest { assert(any("abac", tuple("aasd", "abac", "s"))); assert(find!any([5,3,7,9,4,5,7], tuple(2,4,6)) == [4,5,7]); // cool! } > And if I do, is "any" the name? For a start. We can always vote it to sth more descriptive e.g. 'isAny' in case 'any' turns out misleading. -- Tomek