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.