From 4bcbcc750d36f09778188bf760c349583221bfd3 Mon Sep 17 00:00:00 2001 From: Jacob Quinn Date: Wed, 10 Feb 2016 14:26:03 -0700 Subject: [PATCH] Allow 1-D Generators to have an optional condition when generating elements --- base/essentials.jl | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/base/essentials.jl b/base/essentials.jl index 95908eb2bf75e..7950b56f70e9b 100644 --- a/base/essentials.jl +++ b/base/essentials.jl @@ -194,16 +194,27 @@ const (:) = Colon() immutable Val{T} end -immutable Generator{F,I} +immutable Generator{F,I,C} f::F iter::I + cond::C end +Generator{F,I}(f::F,iter::I) = Generator(f,iter,x->true) + start(g::Generator) = start(g.iter) done(g::Generator, s) = done(g.iter, s) function next(g::Generator, s) v, s2 = next(g.iter, s) - g.f(v), s2 + v2 = g.f(v) + while !g.cond(v2) && !done(g.iter, s2) + v, s2 = next(g.iter, s2) + v2 = g.f(v) + end + v2, s2 end -collect(g::Generator) = map(g.f, g.iter) +function collect(g::Generator) + result = map(g.f, g.iter) + filter!(g.cond, result) +end