codon/test/core/generators.codon

111 lines
2.4 KiB
Python

v = range(5)
print len(v) # EXPECT: 5
print 2 in v # EXPECT: True
print 5 in v # EXPECT: False
print [a for a in v] # EXPECT: [0, 1, 2, 3, 4]
print list(reversed(v)) # EXPECT: [4, 3, 2, 1, 0]
print bool(v) # EXPECT: True
v = range(10, 2, -3)
print len(v) # EXPECT: 3
print 13 in v # EXPECT: False
print 10 in v # EXPECT: True
print 7 in v # EXPECT: True
print 4 in v # EXPECT: True
print 1 in v # EXPECT: False
print [a for a in v] # EXPECT: [10, 7, 4]
print list(reversed(v)) # EXPECT: [4, 7, 10]
print bool(v) # EXPECT: True
v = range(10, 2, 3)
print len(v) # EXPECT: 0
print 13 in v # EXPECT: False
print 10 in v # EXPECT: False
print 7 in v # EXPECT: False
print 4 in v # EXPECT: False
print 1 in v # EXPECT: False
print [a for a in v] # EXPECT: []
print list(reversed(v)) # EXPECT: []
print bool(v) # EXPECT: False
def perms[T](elements: list[T]):
if len(elements) <=1:
yield elements
else:
for perm in perms(elements[1:]):
for i in range(len(elements)):
yield perm[:i] + elements[0:1] + perm[i:]
for a in perms([1,2,3,4]):
print a
# EXPECT: [1, 2, 3, 4]
# EXPECT: [2, 1, 3, 4]
# EXPECT: [2, 3, 1, 4]
# EXPECT: [2, 3, 4, 1]
# EXPECT: [1, 3, 2, 4]
# EXPECT: [3, 1, 2, 4]
# EXPECT: [3, 2, 1, 4]
# EXPECT: [3, 2, 4, 1]
# EXPECT: [1, 3, 4, 2]
# EXPECT: [3, 1, 4, 2]
# EXPECT: [3, 4, 1, 2]
# EXPECT: [3, 4, 2, 1]
# EXPECT: [1, 2, 4, 3]
# EXPECT: [2, 1, 4, 3]
# EXPECT: [2, 4, 1, 3]
# EXPECT: [2, 4, 3, 1]
# EXPECT: [1, 4, 2, 3]
# EXPECT: [4, 1, 2, 3]
# EXPECT: [4, 2, 1, 3]
# EXPECT: [4, 2, 3, 1]
# EXPECT: [1, 4, 3, 2]
# EXPECT: [4, 1, 3, 2]
# EXPECT: [4, 3, 1, 2]
# EXPECT: [4, 3, 2, 1]
def mysum[T](start: T):
m = start
while True:
a = (yield)
if a == -1:
break
m += a
yield m
iadder = mysum(0)
next(iadder)
for i in range(10):
iadder.send(i)
print(iadder.send(-1)) # EXPECT: 45
fadder = mysum(0.0)
next(fadder)
for i in range(10):
fadder.send(float(i))
print(fadder.send(-1.0)) # EXPECT: 45
@test
def test_generator_in_finally():
def foo(n):
if not n:
raise ValueError('not n')
return n
b = False
try:
try:
a = 1
x = 2
z = 0
for a in (foo(i) * x for i in [a,2,3,4,z,5] * x):
pass
finally:
b = True
except ValueError as e:
assert e.message == 'not n'
assert b
test_generator_in_finally()