Generator for formal language (a|b)*

What’s the easiest way to construct a generator that (lazily) returns all words in (a|b)* ordered by its length?

Don’t know if it is the easiest, but I would consider something like

using IterTools
fixedlen(seq, n) = product(Iterators.repeated(seq, n)...)
allseqs(seq) = Iterators.flatten(fixedlen(seq, i) for i in Iterators.countfrom(0))

eg

julia> collect(Iterators.take(allseqs([:a, :b]), 10))
10-element Array{Tuple,1}:
 ()          
 (:a,)       
 (:b,)       
 (:a, :a)    
 (:b, :a)    
 (:a, :b)    
 (:b, :b)    
 (:a, :a, :a)
 (:b, :a, :a)
 (:a, :b, :a)
3 Likes