# Generator for formal language (a|b)\*

**URL:** <https://discourse.julialang.org/t/generator-for-formal-language-a-b/9861>\
**Category:** General Usage\
**Created:** [March 21, 2018, 4:35pm UTC](https://discourse.julialang.org/t/generator-for-formal-language-a-b/9861 "2018-03-21T16:35:02Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![rapus95](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rapus95/32/3773_2.png) [@rapus95](https://discourse.julialang.org/u/rapus95)\
**Post date:** [March 21, 2018, 4:35pm UTC](https://discourse.julialang.org/t/generator-for-formal-language-a-b/9861/1 "2018-03-21T16:35:02Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [March 21, 2018, 5:23pm UTC](https://discourse.julialang.org/t/generator-for-formal-language-a-b/9861/2 "2018-03-21T17:23:31Z")

</div>

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

```julia
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
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)

```
