Initial release.
New functions:
i_enumerate.array can iterate over arbitrary margins, providing you
with a vector index.i_window constructs a sliding window of arbitrary length over a given
iterator, generalizing itertools2::ipairwise and itripletwise.i_rle() and i_rle_inverse() for run-length encoding.i_accum(), reduce(), and sum()
and prod().i_chain(...) has a companion function i_concat(it) which accepts
an iterable (rather than ...).as.numeric, as.vector, as.character,
and as.logical.concat() pastes chunks from an iterator into a vector.New features:
icount, icountn, idiv,
igrid, iseq, i_enumerate.default, iteror.default,
iteror.data.frame, iteror.default and i_enumerate.array
all have shared logic; all accept options chunks, chunksize
and recycle with equivalent behavior.icount and icountn preserve dimnames.icountn, igrid, i_enumerate.array and
iteror.array have option rowMajor to control the order of iteration.i_unique uses a hash table rather than linear scan, for much improved
performance; it also now works with any type of R object.irunif, isample and friends
accept options independent, and seed if given, the iterator will maintain a
private seed value, so that interleaving with other iterators does
not affect reproducibility. You can use a specific random number
generator algorithm by also giving kind, normal.kind, and sample.kind.i_tee works for any iterator, using a queue, where previously
itertools::i_tee only worked for memory-backed iterators.py_iteror wraps an iterator so that it can
be used by Python code via package reticulate. Meanwhile
iteror has a method for Python objects, allowing Python
iterators to be used transparently with iteror code.