Chaining a dynamic number of Ranges

Enerqi kelvin.d.ward at googlemail.com
Sat Jul 21 17:34:47 PDT 2012


Ok thanks! I was hoping to avoid making a copy of the arrays, 
which I think std.array.join does, when treating them as a single 
array range. Wishful thinking perhaps :)

On Saturday, 21 July 2012 at 20:18:25 UTC, Jonathan M Davis wrote:
> On Saturday, July 21, 2012 21:47:19 Enerqi wrote:
>> Thanks! That does join up the arrays as I'd like.
>> An issue remaining is that, unlike with the chain function, I
>> can't sort the output of the joiner function.
>> 
>> Error: template instance std.algorithm.sort!("a <
>> b",cast(SwapStrategy)0,Result) error instantiating
>> 
>> Seems the return type of joiner doesn't implement random access
>> in the same way the return type of chain does.
>> Chain's documentation says "If all input ranges offer random
>> access and $(D
>> length), $(D Chain) offers them as well."
>> 
>> I wonder if joiner is sortable somehow?
>
> For sort to work, it needs a random access range. Operating on 
> anything else
> would be horribly inefficient. With the overload of joiner 
> which doesn't take a
> seperator, it might be possible to make joiner return a random 
> access range if
> all of the ranges passed to it were random access and had 
> length, but it's not
> implemented that way right now, and certainly if any of the 
> ranges passed in
> weren't random access, then that wouldn't work regardless. And 
> it would never
> work with the separator, since the separator would be in the 
> range multiple
> times, and sorting it could really mess it up.
>
> The solution is to create an array and sort that. You can 
> either use
> std.array.array on the result of joiner, or - since I believe 
> that you're
> operating on arrays specifically - you can use std.array.join 
> which will just
> create an array immediately rather than generating a lazy range.
>
> - Jonathan M Daves




More information about the Digitalmars-d-learn mailing list