sequence

func sequence(first:next:)(first: T, next: @escaping (T) -> T?) -> UnfoldFirstSequence<T>

Returns a sequence formed from `first` and repeated lazy applications of `next`.

The first element in the sequence is always first, and each successive element is the result of invoking next with the previous element. The sequence ends when next returns nil. If next never returns nil, the sequence is infinite.

This function can be used to replace many cases that were previously handled using C-style for loops.

Example:

// Walk the elements of a tree from a node up to the root
for node in sequence(first: leaf, next: { $0.parent }) {
  // node is leaf, then leaf.parent, then leaf.parent.parent, etc.
}

// Iterate over all powers of two (ignoring overflow)
for value in sequence(first: 1, next: { $0 * 2 }) {
  // value is 1, then 2, then 4, then 8, etc.
}
  • Parameter first: The first element to be returned from the sequence.
  • Parameter next: A closure that accepts the previous sequence element and returns the next element.
func sequence(state:next:)(state: State, next: @escaping (inout State) -> T?) -> UnfoldSequence<T, State>

Returns a sequence formed from repeated lazy applications of `next` to a mutable `state`.

The elements of the sequence are obtained by invoking next with a mutable state. The same state is passed to all invocations of next, so subsequent calls will see any mutations made by previous calls. The sequence ends when next returns nil. If next never returns nil, the sequence is infinite.

This function can be used to replace many instances of AnyIterator that wrap a closure.

Example:

// Interleave two sequences that yield the same element type
sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()), next: { iters in
  iters.0 = !iters.0
  return iters.0 ? iters.1.next() : iters.2.next()
})
  • Parameter state: The initial state that will be passed to the closure.
  • Parameter next: A closure that accepts an inout state and returns the next element of the sequence.