std.range.Cycle/cycle
- multiple declarations
Function cycle
Repeats the given forward range ad infinitum. If the original range is
infinite (fact that would make Cycle
the identity application),
Cycle
detects that and aliases itself to the range type
itself. That works for non-forward ranges too.
If the original range has random access, Cycle
offers
random access and also offers a constructor taking an initial position
index
. Cycle
works with static arrays in addition to ranges,
mostly for performance reasons.
Note
The input range must not be empty.
Tip
This is a great way to implement simple circular buffers.
Example
import std .algorithm .comparison : equal;
import std .range : cycle, take;
// Here we create an infinitive cyclic sequence from [1, 2]
// (i.e. get here [1, 2, 1, 2, 1, 2 and so on]) then
// take 5 elements of this sequence (so we have [1, 2, 1, 2, 1])
// and compare them with the expected values for equality.
assert(cycle([1, 2]) .take(5) .equal([ 1, 2, 1, 2, 1 ]));
Alias/Struct Cycle
Repeats the given forward range ad infinitum. If the original range is
infinite (fact that would make Cycle
the identity application),
Cycle
detects that and aliases itself to the range type
itself. That works for non-forward ranges too.
If the original range has random access, Cycle
offers
random access and also offers a constructor taking an initial position
index
. Cycle
works with static arrays in addition to ranges,
mostly for performance reasons.
struct Cycle(R)
if (isForwardRange!R && !isInfinite!R);
alias Cycle(R)
= R;
struct Cycle(R)
if (isStaticArray!R);
Struct Cycle
Constructors
Name | Description |
---|---|
this
(input, index)
|
Range primitives |
Properties
Name | Type | Description |
---|---|---|
front [get, set]
|
auto | Range primitives |
save [get]
|
Cycle | Range primitives |
Methods
Name | Description |
---|---|
opIndex
(n)
|
Range primitives |
opIndexAssign
(val, n)
|
Range primitives |
opSlice
(i, j)
|
Range primitives |
popFront
()
|
Range primitives |
Alias Cycle
Struct Cycle
Constructors
Name | Description |
---|---|
this
(input, index)
|
Range primitives |
Properties
Name | Type | Description |
---|---|---|
front [get]
|
inout(ElementType) | Range primitives |
save [get]
|
inout(Cycle) | Range primitives |
Methods
Name | Description |
---|---|
opIndex
(n)
|
Range primitives |
opSlice
(i, j)
|
Range primitives |
popFront
()
|
Range primitives |
Note
The input range must not be empty.
Tip
This is a great way to implement simple circular buffers.
Example
import std .algorithm .comparison : equal;
import std .range : cycle, take;
// Here we create an infinitive cyclic sequence from [1, 2]
// (i.e. get here [1, 2, 1, 2, 1, 2 and so on]) then
// take 5 elements of this sequence (so we have [1, 2, 1, 2, 1])
// and compare them with the expected values for equality.
assert(cycle([1, 2]) .take(5) .equal([ 1, 2, 1, 2, 1 ]));
Authors
Andrei Alexandrescu, David Simcha, Jonathan M Davis, and Jack Stouffer. Credit for some of the ideas in building this module goes to Leonardo Maffi.