I need to create a vector with the states of an iterator for which the element satisfies a certain condition.
However, to do that, I would need to know the first state of an iterator (i.e. the default argument of iterator
), in case the first element satisfies the condition. Is there a way to get it?
Perhaps I misunderstand the question, but it sounds like you are looking for
Required methods | Brief description | |
---|---|---|
iterate(iter) | Returns either a tuple of the first item and initial state or nothing if empty |
from the docs.
Perhaps you could provide more detail on what you are trying to achieve?
Thanks but that’s not what I am looking for. I would like to create a function g(f::Function, iter)
that returns for an arbitrary iterator iter
the vector of states for which the corresponding element satisfies f(x) = 0
The returned vector by g
must satisfy following:
for state in g(f, iter)
f(iterate(iter, state)) == 0
end
For instance,
g(x -> x == 0, [0, 1, 0]) = [1, 3]
Note that, because the first element satisfies the condition, the function should return the first state of the iterator.
There is (semantically) no state for the first iterate
call though? Some iterators might implement their iterate
with a default value as the state but that is not required and not every iterator does this.
As @kristoffer.carlsson says, unfortunately your question has no answer. It’s true that many iterators are implemented through
iterate(::Iterator, state=....)
but many others are not.
What you could do is represent state
by (state,)
and the empty state by ()
. Example:
function g(f, iter)
zerostates = []
curstate = ()
i = iterate(iter, curstate...)
while !isnothing(i)
val, state = i
curstate = (state,)
iszero(f(val)) && push!(zerostates, curstate)
i = iterate(iter, curstate...)
end
return zerostates
end
But it has the downside that you now have a Vector{Any}
. It’s probably as close as you’ll get, though.
Thanks everyone!