# module Steppable

##
Overview

Implements a `#step` method for iterating from a value.

##
Direct including types

- Char
- Number
- Time
- Time::Span

##
Defined in:

steppable.cr

##
Instance Method Summary

- #step(*, to limit = nil, by step, exclusive : Bool = false, &) : Nil

  Iterates from `self` to limit incrementing by the amount of step on each iteration.

- #step(*, to limit = nil, by step, exclusive : Bool = false)

  Iterates from `self` to limit incrementing by the amount of step on each iteration.

##
Instance Method Detail

def step(*, to limit = nil, by step, exclusive : Bool = false, &) : Nil #

Iterates from `self` to limit incrementing by the amount of step on each iteration. If exclusive is `true`, limit is excluded from the iteration.

    ary = [] of Int32
    1.step(to: 4, by: 2) do |x|
      ary << x
    end
    ary                                        # => [1, 3]
    1.step(to: 4, by: 2).to_a                  # => [1, 3]
    1.step(to: 4, by: 1).to_a                  # => [1, 2, 3, 4]
    1.step(to: 4, by: 1, exclusive: true).to_a # => [1, 2, 3]

The type of each iterated element is `typeof(self + step)`.

If to is `nil`, iteration is open ended.

The starting point (`self`) is always iterated as first element, with two exceptions:

- if `self` and to don't compare (i.e. `(self <=> to).nil?`). Example: `1.0.step(Float::NAN)`
- if the direction of to differs from the direction of `by`. Example: `1.step(to: 2, by: -1)`

In those cases the iteration is empty.

def step(*, to limit = nil, by step, exclusive : Bool = false) #

Iterates from `self` to limit incrementing by the amount of step on each iteration. If exclusive is `true`, limit is excluded from the iteration.

    ary = [] of Int32
    1.step(to: 4, by: 2) do |x|
      ary << x
    end
    ary                                        # => [1, 3]
    1.step(to: 4, by: 2).to_a                  # => [1, 3]
    1.step(to: 4, by: 1).to_a                  # => [1, 2, 3, 4]
    1.step(to: 4, by: 1, exclusive: true).to_a # => [1, 2, 3]

The type of each iterated element is `typeof(self + step)`.

If to is `nil`, iteration is open ended.

The starting point (`self`) is always iterated as first element, with two exceptions:

- if `self` and to don't compare (i.e. `(self <=> to).nil?`). Example: `1.0.step(Float::NAN)`
- if the direction of to differs from the direction of `by`. Example: `1.step(to: 2, by: -1)`

In those cases the iteration is empty.