Search
View source code
Display the source code in std/range/package.d from which this page was generated on github.
Report a bug
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using local clone.

# `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.

``` auto cycle(R) (   R input ) if (isInputRange!R); Cycle!R cycle(R) (   R input,   size_t index = 0 ) if (isRandomAccessRange!R && !isInfinite!R); Cycle!R cycle(R) (   ref R input,   size_t index = 0 ) @system if (isStaticArray!R); ```

### 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

NameDescription
`this` (input, index) Range primitives

#### Properties

NameTypeDescription
`front`[get, set] `auto`Range primitives
`save`[get] `Cycle`Range primitives

#### Methods

NameDescription
`opIndex` (n) Range primitives
`opIndexAssign` (val, n) Range primitives
`opSlice` (i, j) Range primitives
`popFront` () Range primitives

### Struct Cycle

#### Constructors

NameDescription
`this` (input, index) Range primitives

#### Properties

NameTypeDescription
`front`[get] `inout(ElementType)`Range primitives
`save`[get] `inout(Cycle)`Range primitives

#### Methods

NameDescription
`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.