Splitting a sequence using a binary predicate on adjacent elements

Andrea Fontana nospam at example.com
Tue Oct 17 14:15:02 UTC 2017


On Tuesday, 17 October 2017 at 13:09:18 UTC, Nordlöw wrote:
> I can't find any algorithm/range in Phobos that can be used to 
> split (eagerly or lazily) a sequence using a binary predicate 
> on adjacent elements as follows
>
> [1,2,3,5,10,11,12,13,20,21,100].splitBy!"a + 1 != b"()
>
> should evaluate to
>
> [[1,2,3], [5], [10,11,12,13], [20,21], [100]]
>
> .
>
> Is there one?

Try this:

import std.range;
import std.algorithm;
import std.stdio;

import std.typecons;

auto splitBy(alias F, R)(R range)
{
	
	auto tmp = range
		.map!(x => tuple(x, 0))
		.cumulativeFold!((a,b) => tuple(b[0], 
(!F(a[0],b[0]))?a[1]:a[1]+1))
		.chunkBy!((a,b) => a[1] == b[1])
		.map!(x => x.map!(y => y[0]));
	
	return tmp;
}

void main()
{
	[1,2,3,5,10,11,12,13,20,21,100].splitBy!((a,b) => a+1 != 
b)().writeln;
}


Andrea


More information about the Digitalmars-d-learn mailing list