extend "in" to all array types

Meta jared771 at gmail.com
Wed Jan 15 09:13:35 PST 2014


On Wednesday, 15 January 2014 at 15:48:13 UTC, John Colvin wrote:
> On Wednesday, 15 January 2014 at 15:30:35 UTC, pplantinga wrote:
>> In python, I really like the ability to check if an element is 
>> in an array:
>>
>> if x in array:
>>  # do something
>>
>> D has this, but only for associative arrays. Is there any 
>> chance we could extend this to every kind of array?
>
> import std.algorithm: canFind;
>
> if(array.canFind(x))
>     //do something
>
>
> alternatively, something like this:
>
> struct InWrapper(T)
> {
>     T unwrapped;
>     alias unwrapped this;
>
>     auto opBinaryRight(string op, T)(T el)
>         if(op == "in")
>     {
>         import std.algorithm : canFind;
>         return unwrapped.canFind(el);
>     }
> }
>
> unittest
> {
>     InWrapper!(int[]) arr;
>     arr = [1,2,3,4];
>
>     assert(4 in arr);
>     assert(!(5 in arr));
> }

auto inWrap(T)(T[] arr)
{
     static struct InWrapper
     {
         import std.typecons: Nullable;

         private T[] payload;

         Nullable!size_t opBinaryRight(string op: "in")(T val)
         {
             Nullable!size_t index;
             foreach (i, element; payload)
             {
                 if (element == val)
                 {
                     index = i;
					
					return index;
                 }
             }

             return index;
         }
     }

     return InWrapper(arr);
}

void main()
{
     auto arr = [0, 1, 2, 3, 4];
	auto i = 2 in arr.inWrap;
     assert(!i.isNull);
	assert(i == 2);
}


More information about the Digitalmars-d mailing list