extend foreach to work on non-arrays

aliak something at something.com
Thu May 24 23:08:39 UTC 2018


On Thursday, 24 May 2018 at 23:02:00 UTC, Neia Neutuladh wrote:
> On Thursday, 24 May 2018 at 22:43:00 UTC, IntegratedDimensions 
> wrote:
>> Doesn't make any sense?
>>
>> foreach(a; x)
>>
>> if x is not an array then a = x and the loop reduces simply 
>> and function to the case it is not so their can be no harm.
>>
>> It unifies the concepts so that one does not have to worry if 
>> x is an array or not and can offer no harm since when x is not 
>> an array everything simply reduces to an an alias of x.
>
> You can already do this for any type you define:
>
> class Foo
> {
>   auto iterate() { return only(this); }
>   alias iterate this;
> }
>
> Can you give examples of code that is awkward today that would 
> be simplified with your proposal? I don't expect people to give 
> full cost-benefit analyses for every suggestion, but it'd be 
> nice if you could at least mention some of the upsides.

And then you can generalize this for any type

auto elseOnly(T)(T t) {
   import std.range: isInputRange;
   static if (isInputRange!T) {
     return t;
   } else  {
     import std.range: only;
     return only(t);
   }
}

foreach(i; 3.elseOnly) {
}

foreach(i; [1, 2, 3].elseOnly) {
}


Cheers
- Ali




More information about the Digitalmars-d mailing list