Skip to content

Instantly share code, notes, and snippets.

@JeffBezanson
Created May 12, 2017 19:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JeffBezanson/217922de7815916591bbd6549111f13d to your computer and use it in GitHub Desktop.
Save JeffBezanson/217922de7815916591bbd6549111f13d to your computer and use it in GitHub Desktop.
diff --git a/base/iterators.jl b/base/iterators.jl
index 1c2ab13..4e5d1b5 100644
--- a/base/iterators.jl
+++ b/base/iterators.jl
@@ -694,28 +694,30 @@ function start(f::Flatten)
d = done(f.it, s)
# this is a simple way to make this function type stable
d && throw(ArgumentError("argument to Flatten must contain at least one iterator"))
+ done_inner = false
while !d
inner, s = next(f.it, s)
s2 = start(inner)
- !done(inner, s2) && break
+ done_inner = done(inner, s2)
+ !done_inner && break
d = done(f.it, s)
end
- return s, inner, s2
+ return (d & done_inner), s, inner, s2
end
@inline function next(f::Flatten, state)
- s, inner, s2 = state
+ _done, s, inner, s2 = state
val, s2 = next(inner, s2)
- while done(inner, s2) && !done(f.it, s)
+ done_inner = done_outer = false
+ while (done_inner=done(inner, s2)) && !(done_outer=done(f.it, s))
inner, s = next(f.it, s)
s2 = start(inner)
end
- return val, (s, inner, s2)
+ return val, ((done_inner & done_outer), s, inner, s2)
end
@inline function done(f::Flatten, state)
- s, inner, s2 = state
- return done(f.it, s) && done(inner, s2)
+ return state[1]
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment