On Wednesday, 15 January 2014 at 17:29:07 UTC, Tobias Pankrath wrote:
On Wednesday, 15 January 2014 at 17:13:37 UTC, Meta wrote:

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);
}

The in-operator should return T* for consistency with the build-in ones.

That was exactly my thoughts:

----
auto each(T)(T[] arr) pure nothrow {
    static struct InWrapper {
        private T[] payload;
                
        T* opBinaryRight(string op : "in")(T val) pure nothrow {
            foreach (ref T element; payload) {
                                if (element == val)
                                        return &element;
            }

            return null;
        }
    }

    return InWrapper(arr);
}

void main() {
    int[] arr = [0, 1, 2, 3, 4];
    auto i = 2 in arr.each;
    assert(i !is null);
    assert(*i == 2);
}
----

Something like that should really be in std.array.

Reply via email to