Iteration utilities

    There are several different ways to think about this iterator wrapper:

    1. It provides a mutable wrapper around an iterator and its iteration state.
    2. It turns an iterator-like abstraction into a -like abstraction.
    3. It’s an iterator that mutates to become its own rest iterator whenever an item is produced.

    Stateful provides the regular iterator interface. Like other mutable iterators (e.g. ), if iteration is stopped early (e.g. by a break in a loop), iteration can be resumed from the same spot by continuing to iterate over the same iterator object (in contrast, an immutable iterator would restart from the beginning).

    Examples

    1. julia> a = Iterators.Stateful("abcdef");
    2. julia> isempty(a)
    3. false
    4. julia> popfirst!(a)
    5. 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
    6. julia> collect(Iterators.take(a, 3))
    7. 3-element Vector{Char}:
    8. 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
    9. 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
    10. 'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
    11. julia> collect(a)
    12. 2-element Vector{Char}:
    13. 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
    14. 'f': ASCII/Unicode U+0066 (category Ll: Letter, lowercase)
    1. julia> a = Iterators.Stateful([1,1,1,2,3,4]);
    2. julia> for x in a; x == 1 || break; end
    3. julia> peek(a)
    4. 3
    5. julia> sum(a) # Sum the remaining elements
    6. 7

    source

    — Function

    1. zip(iters...)

    Run multiple iterators at the same time, until any of them is exhausted. The value type of the zip iterator is a tuple of values of its subiterators.

    Note

    zip orders the calls to its subiterators in such a way that stateful iterators will not advance when another iterator finishes in the current iteration.

    Examples

    1. julia> a = 1:5
    2. 1:5
    3. julia> b = ["e","d","b","c","a"]
    4. 5-element Vector{String}:
    5. "e"
    6. "d"
    7. "b"
    8. "c"
    9. "a"
    10. julia> c = zip(a,b)
    11. zip(1:5, ["e", "d", "b", "c", "a"])
    12. julia> length(c)
    13. 5
    14. julia> first(c)
    15. (1, "e")

    source

    — Function

    1. enumerate(iter)

    An iterator that yields (i, x) where i is a counter starting at 1, and x is the ith value from the given iterator. It’s useful when you need not only the values x over which you are iterating, but also the number of iterations so far. Note that i may not be valid for indexing iter; it’s also possible that x != iter[i], if iter has indices that do not start at 1. See the pairs(IndexLinear(), iter) method if you want to ensure that i is an index.

    Examples

    1. julia> a = ["a", "b", "c"];
    2. julia> for (index, value) in enumerate(a)
    3. println("$index $value")
    4. end
    5. 1 a
    6. 2 b
    7. 3 c

    source

    — Function

    1. rest(iter, state)

    An iterator that yields the same elements as iter, but starting at the given state.

    Examples

    1. julia> collect(Iterators.rest([1,2,3,4], 2))
    2. 3-element Vector{Int64}:
    3. 2
    4. 3
    5. 4

    source

    — Function

      An iterator that counts forever, starting at start and incrementing by step.

      Examples

      1. julia> for v in Iterators.countfrom(5, 2)
      2. v > 10 && break
      3. println(v)
      4. end
      5. 7
      6. 9

      source

      — Function

      1. take(iter, n)

      An iterator that generates at most the first n elements of iter.

      Examples

      1. julia> a = 1:2:11
      2. 1:2:11
      3. julia> collect(a)
      4. 6-element Vector{Int64}:
      5. 1
      6. 3
      7. 5
      8. 7
      9. 9
      10. 11
      11. julia> collect(Iterators.take(a,3))
      12. 3-element Vector{Int64}:
      13. 1
      14. 3
      15. 5

      source

      — Function

      An iterator that generates element from iter as long as predicate pred is true, afterwards, drops every element.

      Julia 1.4

      This function requires at least Julia 1.4.

      Examples

      1. julia> s = collect(1:5)
      2. 5-element Vector{Int64}:
      3. 1
      4. 2
      5. 3
      6. 4
      7. 5
      8. julia> collect(Iterators.takewhile(<(3),s))
      9. 2-element Vector{Int64}:
      10. 1
      11. 2

      Base.Iterators.drop — Function

      1. drop(iter, n)

      An iterator that generates all but the first n elements of iter.

      Examples

      1. julia> a = 1:2:11
      2. 1:2:11
      3. julia> collect(a)
      4. 6-element Vector{Int64}:
      5. 1
      6. 3
      7. 5
      8. 7
      9. 9
      10. 11
      11. julia> collect(Iterators.drop(a,4))
      12. 2-element Vector{Int64}:
      13. 9
      14. 11

      Base.Iterators.dropwhile — Function

      1. dropwhile(pred, iter)

      An iterator that drops element from iter as long as predicate pred is true, afterwards, returns every element.

      Julia 1.4

      This function requires at least Julia 1.4.

      Examples

      1. julia> s = collect(1:5)
      2. 5-element Vector{Int64}:
      3. 1
      4. 2
      5. 3
      6. 4
      7. 5
      8. julia> collect(Iterators.dropwhile(<(3),s))
      9. 3-element Vector{Int64}:
      10. 4
      11. 5

      Base.Iterators.cycle — Function

      1. cycle(iter)

      An iterator that cycles through iter forever. If iter is empty, so is cycle(iter).

      Examples

      1. julia> for (i, v) in enumerate(Iterators.cycle("hello"))
      2. print(v)
      3. i > 10 && break
      4. end
      5. hellohelloh

      Base.Iterators.repeated — Function

      1. repeated(x[, n::Int])

      An iterator that generates the value x forever. If n is specified, generates x that many times (equivalent to take(repeated(x), n)).

      Examples

      1. julia> collect(a)
      2. 4-element Vector{Matrix{Int64}}:
      3. [1 2]
      4. [1 2]
      5. [1 2]
      6. [1 2]

      Base.Iterators.product — Function

      1. product(iters...)

      Return an iterator over the product of several iterators. Each generated element is a tuple whose ith element comes from the ith argument iterator. The first iterator changes the fastest.

      Examples

      1. julia> collect(Iterators.product(1:2, 3:5))
      2. 2×3 Matrix{Tuple{Int64, Int64}}:
      3. (1, 3) (1, 4) (1, 5)
      4. (2, 3) (2, 4) (2, 5)

      Base.Iterators.flatten — Function

      1. flatten(iter)

      Given an iterator that yields iterators, return an iterator that yields the elements of those iterators. Put differently, the elements of the argument iterator are concatenated.

      Examples

      Base.Iterators.partition — Function

      1. partition(collection, n)

      Iterate over a collection n elements at a time.

      Examples

      1. julia> collect(Iterators.partition([1,2,3,4,5], 2))
      2. 3-element Vector{SubArray{Int64, 1, Vector{Int64}, Tuple{UnitRange{Int64}}, true}}:
      3. [1, 2]
      4. [3, 4]
      5. [5]

      Base.Iterators.map — Function

      1. Iterators.map(f, iterators...)

      Julia 1.6

      This function requires at least Julia 1.6.

      Examples

      1. julia> collect(Iterators.map(x -> x^2, 1:3))
      2. 3-element Vector{Int64}:
      3. 1
      4. 4
      5. 9

      Base.Iterators.filter — Function

      1. Iterators.filter(flt, itr)

      Given a predicate function flt and an iterable object itr, return an iterable object which upon iteration yields the elements x of itr that satisfy flt(x). The order of the original iterator is preserved.

      This function is lazy; that is, it is guaranteed to return in $Θ(1)$ time and use $Θ(1)$ additional space, and flt will not be called by an invocation of filter. Calls to flt will be made when iterating over the returned iterable object. These calls are not cached and repeated calls will be made when reiterating.

      See for an eager implementation of filtering for arrays.

      Examples

      1. julia> f = Iterators.filter(isodd, [1, 2, 3, 4, 5])
      2. Base.Iterators.Filter{typeof(isodd), Vector{Int64}}(isodd, [1, 2, 3, 4, 5])
      3. julia> foreach(println, f)
      4. 1
      5. 3
      6. 5

      source

      — Function

      1. Iterators.accumulate(f, itr; [init])

      Given a 2-argument function f and an iterator itr, return a new iterator that successively applies f to the previous value and the next element of itr.

      This is effectively a lazy version of Base.accumulate.

      Julia 1.5

      Keyword argument init is added in Julia 1.5.

      Examples

      1. julia> f = Iterators.accumulate(+, [1,2,3,4]);
      2. julia> foreach(println, f)
      3. 1
      4. 3
      5. 6
      6. 10
      7. julia> f = Iterators.accumulate(+, [1,2,3]; init = 100);
      8. julia> foreach(println, f)
      9. 101
      10. 103
      11. 106

      Base.Iterators.reverse — Function

      1. Iterators.reverse(itr)

      Given an iterator itr, then reverse(itr) is an iterator over the same collection but in the reverse order.

      This iterator is “lazy” in that it does not make a copy of the collection in order to reverse it; see for an eager implementation.

      Not all iterator types T support reverse-order iteration. If T doesn’t, then iterating over Iterators.reverse(itr::T) will throw a MethodError because of the missing methods for Iterators.Reverse{T}. (To implement these methods, the original iterator itr::T can be obtained from r = Iterators.reverse(itr) by r.itr.)

      Examples

      1. julia> foreach(println, Iterators.reverse(1:5))
      2. 5
      3. 4
      4. 3
      5. 2
      6. 1

      source

      — Function

        Returns the one and only element of collection x, and throws an ArgumentError if the collection has zero or multiple elements.

        See also: first, .

        Julia 1.4

        This method requires at least Julia 1.4.

        source

        — Function

        1. peel(iter)

        Returns the first element and an iterator over the remaining elements.

        source