Advertisement
DeaD_EyE

Piping Generators together

Nov 23rd, 2016
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.28 KB | None | 0 0
  1. import functools
  2. import operator
  3.  
  4. class Compositor:
  5.     def __init__(self, gen):
  6.         self._gen = gen
  7.     def __or__(self, other):
  8.         if isinstance(other, Compositor):
  9.             return other._gen(self._gen)
  10.     def __ror__(self, other):
  11.         try:
  12.             other = iter(other)
  13.         except TypeError:
  14.             raise Exception('Need an iterable')
  15.         return self._gen(other)
  16.  
  17. def make_composition(gens):
  18.     return functools.reduce(operator.or_, [Compositor(e) for e in gens])
  19.  
  20. def gen1(source):
  21.     for i in source:
  22.         if i % 2 == 0:
  23.             yield i **2
  24.         else:
  25.             yield i ** 3
  26.  
  27. def gen2(source):
  28.     for i in source:
  29.         yield i * 5
  30.  
  31. def gen2(source):
  32.     for i in source:
  33.         yield i - (i * 5)
  34.  
  35. def gen3(source):
  36.     for i in source:
  37.         yield i - (i * -6)
  38.  
  39. def gen4(source):
  40.     for i in source:
  41.         yield i / 2
  42.  
  43. if __name__ == '__main__':
  44.     source = list(range(1000))
  45.     result1 = make_composition([source, gen1, gen2, gen3, gen4])
  46.     result1 = list(result1)
  47.    
  48.     result2 = list(source | Compositor(gen1) | Compositor(gen2) | Compositor(gen3) | Compositor(gen4))
  49.    
  50.     print(list(result2)[:10]) #prints the first 10 results
  51.     print('Results are the same:' ,result1 == result2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement