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!