13.2. FP Pattern Pipe

13.2.1. SetUp

>>> from functools import reduce

13.2.2. Problem

>>> def square(x):
...     return x ** 2
>>>
>>> def even(x):
...     return x % 2 == 0
>>>
>>> def add(a, b):
...     return a + b
>>>
>>> data = range(0,100)
>>> data = filter(even, data)
>>> data = map(square, data)
>>> data = reduce(add, data)
>>>
>>> print(data)
161700

13.2.3. Solution

>>> class Pipe:
...     def __init__(self, values):
...         self.values = values
...
...     def map(self, func):
...         self.values = map(func, self.values)
...         return self
...
...     def filter(self, func):
...         self.values = filter(func, self.values)
...         return self
...
...     def reduce(self, func):
...         return reduce(func, self.values)
>>>
>>> result = (
...     Pipe(range(0,100))
...     .filter(even)
...     .map(square)
...     .reduce(add)
... )
>>>
>>> print(result)
161700

13.2.4. Lambda

>>> result = (
...     Pipe(range(0,100))
...     .filter(even)
...     .map(square)
...     .map(lambda x: x+1)
...     .filter(lambda x: x>100)
...     .reduce(add)
... )
>>>
>>> print(result)
161625

13.2.5. Pipe Operator

>>> class Pipe:
...     def __init__(self, value):
...         self.value = value
...
...     def __repr__(self):
...         return str(self.value)
...
...     def __rshift__(self, func):
...         self.value = func(self.value)
...         return self
>>>
>>> def lower(string):
...     return string.lower()
>>>
>>> def strip(string):
...     return string.strip()
>>>
>>> def replace(string):
...     return string.replace('!', '')
>>>
>>> def capitalize(string):
...     return string.capitalize()
>>>
>>>
>>> text = '  Hello World!  '
>>>
>>> output = (
...     Pipe(text)
...     >> strip
...     >> lower
...     >> replace
...     >> capitalize
... )
>>>
>>> print(output)
Hello world