import intseqdb

# a function that return a function defining a generator
# for the Catalan numbers: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, ...
def catalan_gen():
	def _catalan_gen():
		i = 0
		val = 1
		while True:
			yield val
			val = val * (2 * (2*i + 1)) / (i + 2)
			i   = i + 1
        # only return the function defining the generator
	return _catalan_gen

# create a Catalan sequence
seq_catalan =  intseqdb.Sequence("Catalan numbers", catalan_gen())

# 10 possibilities for printing the first 10 integers
# of the Catalan numbers, i.e.,
# 1 , 1 , 2 , 5 , 14 , 42 , 132 , 429 , 1430 , 4862

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# the C way
print "EXAMPLE 1"
it_seq_catalan = iter(seq_catalan)
for i in range(10):
    x = it_seq_catalan.next()
    print x,
    if i < 9:
        print ",",
print

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# still the hard way ... 
print "EXAMPLE 2"
it_seq_catalan = iter(seq_catalan)
i = 0
for x in it_seq_catalan:
    print x,
    if i > 8:
        print
        break
    else:
        print ",",
        i = i+1

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# the Sequence class has an __iter__ method !
print "EXAMPLE 3"
i = 0
for x in seq_catalan:
    print x,
    if i > 8:
        print
        break
    else:
        print ",",
        i = i+1        

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# enumerate provides an index, let's use it
print "EXAMPLE 4"
for i, x in enumerate(seq_catalan):
    print x,
    if i > 8:
        print
        break
    else:
        print ",",
        i = i+1

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# using a list to store the elements and print it
print "EXAMPLE 5"
l = []
for x in seq_catalan:
    l.append(x)
    if len(l) > 9:
        break
print " , ".join([str(x) for x in l])

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# using a list comprehension, itertools is your friend !
print "EXAMPLE 6"
l = [x for x in intseqdb.take(10, seq_catalan)]
print " , ".join([str(x) for x in l])

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# using a generator expression instead of a list comprehension
print "EXAMPLE 7"
l = (x for x in intseqdb.take(10, seq_catalan))
# type(l) is <type 'generator'> ... good !
print type(l)
print " , ".join([str(x) for x in l])

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# using a generator expression instead of a list comprehension
print "EXAMPLE 8"
l = (x for x in intseqdb.take(10, seq_catalan))
# type((str(x) for x in l)) is <type 'generator'> ... better !
print type(str(x) for x in l)
print " , ".join(str(x) for x in l)

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# wait ... no need of any intermediate variable
print "EXAMPLE 9"
print " , ".join([str(x) for x in intseqdb.take(10, seq_catalan)])

print '=*=*=*=*=*=*=*=*=*=*=*=*='

# without any intermediate variable and using a generator expression
# can we do better and shorter than that ?!
print "EXAMPLE 10"
print " , ".join(str(x) for x in intseqdb.take(10, seq_catalan))

print '=*=*=*=*=*=*=*=*=*=*=*=*='
