From c290c850884ef27d978e82f4ee1864e1428d2644 Mon Sep 17 00:00:00 2001 From: Nathan Sashihara <21227491+n8sh@users.noreply.github.com> Date: Mon, 5 Nov 2018 17:06:09 -0500 Subject: [PATCH] retro(retro(range)) is range --- source/tanya/algorithm/iteration.d | 44 ++++++++++++++++++------------ 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/source/tanya/algorithm/iteration.d b/source/tanya/algorithm/iteration.d index 27fce71..95f077f 100644 --- a/source/tanya/algorithm/iteration.d +++ b/source/tanya/algorithm/iteration.d @@ -408,22 +408,10 @@ if (isInputRange!R) } } -/** - * Iterates a bidirectional range backwards. - * - * If $(D_PARAM Range) is a random-access range as well, the resulting range - * is a random-access range too. - * - * Params: - * Range = Bidirectional range type. - * range = Bidirectional range. - * - * Returns: Bidirectional range with the elements order reversed. - */ -auto retro(Range)(Range range) -if (isBidirectionalRange!Range) +private { - static struct Retro + // Reverse-access-order range returned by `retro`. + struct Retro(Range) { Range source; @@ -526,9 +514,31 @@ if (isBidirectionalRange!Range) } } } - } - return Retro(range); + version (unittest) static assert(isBidirectionalRange!Retro); + } +} + +/** + * Iterates a bidirectional range backwards. + * + * If $(D_PARAM Range) is a random-access range as well, the resulting range + * is a random-access range too. + * + * Params: + * Range = Bidirectional range type. + * range = Bidirectional range. + * + * Returns: Bidirectional range with the elements order reversed. + */ +auto retro(Range)(return Range range) +if (isBidirectionalRange!Range) +{ + // Special case: retro(retro(range)) is range + static if (is(Range == Retro!RRange, RRange)) + return range.source; + else + return Retro!Range(range); } ///