Hi, sorry for naive question. I’ve read carefully about iterators ,
but is there a straightforward method to get “from n to m” elements of iterator,
without such as rest(take(iter, m), n)
?
NB I use complicated generic iterator, with Combinatorics: multiset_permutation
and IterTools: imap
, so rest(take(iter, m), n)
works but [n:m]
not works
You can still use the n:m
syntax, even when neither n
nor m
is known at compile time:
julia> f(n, m) = n:m
f (generic function with 1 method)
julia> collect(f(7, 9))
3-element Vector{Int64}:
7
8
9
I think the approach you mentioned is the only approach that works with generic iterators. However, you should use drop
instead of rest
.
julia> using .Iterators: drop, take
julia> m_to_n(itr, m, n) = drop(take(itr, n), m-1);
julia> itr = m_to_n(1:10, 3, 8);
julia> collect(itr)
6-element Vector{Int64}:
3
4
5
6
7
8
Well, thank you for evidence, sorry for my bad English! “Generic”
How do you think, which combination of drop
, take
, rest
be most efficient for big (with ~10^6 members) iterator?
The drop
and take
combination should be reasonably efficient. You should generally avoid using Iterators.rest
since it relies on understanding how the internal state
variable of the iterator is used, which is normally an implementation detail that is not exposed as part of the interface for a given iterator.
Off-topic: Is there a reason to prefer .Iterators
over Base.Iterators
?
Not really. I guess it’s just a matter of taste.