returns icon indicating copy to clipboard operation
returns copied to clipboard

Consider adding decorators to work with generators

Open thepabloaguilar opened this issue 5 years ago • 2 comments

After think a lot about #355 it will be great to provide the same mechanisms we have to "normal" functions to generators! It is not uncommon to see generators in many Python code, we use it when reading a file, iterating over Query objects and so on!

Today is impossible to work with generators using our current set of decorators like @safe:

>>> from typing import Generator
>>> from returns.result import safe
>>>
>>> def numbers() -> Generator[int, None, None]:
...     for x in range(2):
...         yield x
...
>>> for number in numbers():
...     print(number)
...
0
1
>>> for number in safe(numbers)():
...     print(number)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '_Success' object is not iterable

Expected behavior:

>>> from returns.result import safe_iter
>>>
>>> for number in safe_iter(numbers)():
...     print(number)
...
<returns.result._Success object at X>
<returns.result._Success object at X>

thepabloaguilar avatar Sep 09 '20 02:09 thepabloaguilar

Or, something like apply_to_each(safe)(numbers)

@apply_to_each(safe)
def numbers() -> Generator[...]:
    ...

The same should work for impure, impure_safe, etc.

sobolevn avatar Sep 09 '20 07:09 sobolevn

I really like this approach!!

@apply_to_each(safe)
def numbers() -> Generator[...]:
    ...

thepabloaguilar avatar Sep 09 '20 14:09 thepabloaguilar