Thread overview
Learning to use ranges instead of arrays
Jul 20, 2014
Bob Tolbert
Jul 20, 2014
John Colvin
Jul 20, 2014
Bob Tolbert
Jul 20, 2014
Ivan Kazmenko
July 20, 2014
I find myself writing this code too much and i'm curious what D
idiom I am missing.

given a list of files (or any strings) and then maybe I want to
sort them and maybe I don't.

     string [] fileList;

     ... fill list

     if (sort) {
         string [] tempList;
         foreach(filename; sort(fileList)) {
             tempList ~= filename;
         }
         fileList = tempList;
     }

     foreach(filename, fileList) {
         ... do something;
     }

but I know this is ugly code, so I'm curious as to how to make it better. I suspect it is something very simple, about switching everything I do to 'ranges', but I can't see it yet.

Thanks for any input,
Bob
July 20, 2014
On Sunday, 20 July 2014 at 16:02:05 UTC, Bob Tolbert wrote:
> I find myself writing this code too much and i'm curious what D
> idiom I am missing.
>
> given a list of files (or any strings) and then maybe I want to
> sort them and maybe I don't.
>
>      string [] fileList;
>
>      ... fill list
>
>      if (sort) {
>          string [] tempList;
>          foreach(filename; sort(fileList)) {
>              tempList ~= filename;
>          }
>          fileList = tempList;
>      }
>
>      foreach(filename, fileList) {
>          ... do something;
>      }
>
> but I know this is ugly code, so I'm curious as to how to make it better. I suspect it is something very simple, about switching everything I do to 'ranges', but I can't see it yet.
>
> Thanks for any input,
> Bob

Even without ranges, you can do this:

      string [] fileList;

      ... fill list

      if (sort)
          sort(fileList);

      foreach(filename, fileList) {
          ... do something;
      }

because sort works in-place.
July 20, 2014
On Sunday, 20 July 2014 at 16:11:03 UTC, John Colvin wrote:
>
> Even without ranges, you can do this:
>
>       string [] fileList;
>
>       ... fill list
>
>       if (sort)
>           sort(fileList);
>
>       foreach(filename, fileList) {
>           ... do something;
>       }
>
> because sort works in-place.

Oh, I see that now. Guess when I saw it returned a SortedRange, I stopped reading and missed the bit about the underlying array also being sorted.

Thanks for the quick help,
Bob
July 20, 2014
Also, there is std.array.array for the ranges you want to convert to arrays.
For example, if "a" is an array, "a.map!(x => x * 2).array" produces an new array of doubled values (as opposed to a lazy range produced by std.algorithm.map).