Add iterator for PossibleOperations data structure

This commit is contained in:
2023-11-20 16:56:42 +01:00
parent 992450374c
commit c73053f991
4 changed files with 51 additions and 0 deletions

36
src/operation/iterate.jl Normal file
View File

@ -0,0 +1,36 @@
import Base.iterate
const _POSSIBLE_OPERATIONS_FIELDS = fieldnames(PossibleOperations)
function iterate(possibleOperations::PossibleOperations)
for fieldname in _POSSIBLE_OPERATIONS_FIELDS
iterator = iterate(getfield(possibleOperations, fieldname))
if (!isnothing(iterator))
return (result = iterator[1], state = (fieldname, iterator[2]))
end
end
return nothing
end
function iterate(possibleOperations::PossibleOperations, state)
newStateSym = state[1]
newStateIt = iterate(getfield(possibleOperations, newStateSym), state[2])
if !isnothing(newStateIt)
return (result = newStateIt[1], state = (newStateSym, newStateIt[2]))
end
# cycle to next field
index = findfirst(x -> x == newStateSym, _POSSIBLE_OPERATIONS_FIELDS) + 1
while index <= length(_POSSIBLE_OPERATIONS_FIELDS)
newStateSym = _POSSIBLE_OPERATIONS_FIELDS[index]
newStateIt = iterate(getfield(possibleOperations, newStateSym))
if !isnothing(newStateIt)
return (result = newStateIt[1], state = (newStateSym, newStateIt[2]))
end
index += 1
end
return nothing
end