problem with multiwayMerge and chunkBy

Nicholas Wilson iamthewilsonator at hotmail.com
Sun Nov 5 03:21:06 UTC 2017


On Saturday, 4 November 2017 at 18:57:17 UTC, Matthew Gamble 
wrote:
> Dear most helpful and appreciated D community,
>
> I'm a non-pro academic biologist trying to code a modeler of 
> transcription in D. I've run into a small roadblock. Any help 
> would be greatly appreciated. I'm hoping someone can tell me 
> why I get the following run-time error from this code. I've 
> reduced it to something simple:
>
>         import std.algorithm;
>         import std.range;
>
> 	auto d =[2,4,6,8];
> 	auto e =[1,2,3,5,7];
> 	auto f =[d,e];
>
> 	writeln(f.multiwayMerge.chunkBy!"a == b");//error happens
>         writeln(f.multiwayMerge.array.chunkBy!"a == b");//no 
> error, but there must be a better way!
>
> My understanding is that chunkBy should be able to take an 
> input range. Is that not true? I'm trying to get a merged 
> sorted view of two sorted ranges followed by merging records 
> based on a predicate without allocating memory or swapping the 
> underlying values. Speed will be very important at the end of 
> the day and sticking the ".array" in the middle kills me, given 
> the size of the actual ranges.

It should, this looks like a bug somewhere, please file one at 
issues.dlang.org/ .

in the mean time

struct Replicate(T)
{
     Tuple!(T, uint) e;
     @property bool empty() { return e[1] == 0 ; }
     @property auto front() {return e[0]; }
     void popFront() { --e[1]; }
}

Replicate!T replicate(T)(Tuple!(T, uint) e)
{
     return typeof(return)(e);
}

f.multiwayMerge.group!"a == b".map!(replicate).writeln;

Does the same thing provided your predicate is "a == b".


More information about the Digitalmars-d-learn mailing list