Infinite range of nullable elements
anonymous via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jul 17 05:44:56 PDT 2015
On Friday, 17 July 2015 at 07:42:09 UTC, Roland Hadinger wrote:
> Here's how I would implement the basic behaviour (could be
> extended to also forward bidirectional and random access
> functions):
>
> ---
> auto cushion(R)(R r)
> if (isInputRange!R)
> {
> static if (isInfinite!R) { return r; } else {
>
> struct _Cushion(R)
> {
> R r;
>
> alias E = ElementType!R;
> alias NE = Nullable!E;
>
> @property bool empty() { return false; }
>
> @property NE front()
> {
> return !r.empty ? NE(r.front) : NE();
> }
>
> void popFront()
> {
> if (!r.empty) r.popFront();
> }
> }
>
> return _Cushion!R(r);
> }
> }
>
> ---
>
> I didn't find anything like this Phobos. Did I miss something?
The building blocks are there. You're `map`ping the original
range to `Nullable`, and then you're `chain`ing an infinite range
(`cycle`) of nulls behind.
----
import std.range: isInputRange;
auto cushion(R)(R r)
if (isInputRange!R)
{
import std.algorithm: map;
import std.range: chain, cycle, ElementType, only;
import std.typecons: Nullable;
alias E = ElementType!R;
alias NE = Nullable!E;
return chain(r.map!NE, NE().only.cycle);
}
----
More information about the Digitalmars-d-learn
mailing list