Tuyau is a library that allows you to process values through a sequence of steps, similar to a pipe.
# Before
for name in names:
len(hash(upper_case(decode(name))))
# After
tube = Tube(decode, upper_case, hash, len)
for name in names:
tube(name)
# or alternative
tube.send(name)
You can install Tuyau using pip:
pip install tuyau
To create a Tuyau, you can pass a sequence of callable steps to the constructor. Each step should be a callable that takes one argument and returns a value of any type.
from tuyau import Tube
def add_one(number: int) -> int:
"""Simple step: add one to the number."""
return number + 1
def multiply_by_two(number: int) -> int:
"""Simple step: multiply the number by two."""
return number * 2
tube = Tube(add_one, multiply_by_two)
print(tube.send(1)) # 4
You can process values through the Tuyau by calling it as if it were a function. The value will go through each step in the sequence and get transformed accordingly.
result = tube(5)
print(result) # Output: 12 (5 + 1 = 6, 6 * 2 = 12)
You can also use the send()
method, which is an alias for calling the Tuyau directly.
result = tube.send(5)
print(result) # Output: 12
Here's an example using lambda functions as steps:
tube = Tube(lambda x: x + 1, lambda x: x * 2)
result = tube(3)
print(result) # Output: 8 (3 + 1 = 4, 4 * 2 = 8)
The Tube
class is designed to support typing for both input and output.
from tuyau import Tube
def add_one(num: int) -> int:
return num + 1
def multiply_by_two(num: int) -> int:
return num * 2
# Create Tube with multiple callables that take and return int
tube: Tube[int, int] = Tube(add_one, multiply_by_two)
tube: Tube[int, str] = Tube(add_one, multiply_by_two, str)
# Process integers through the tubes
result: int = tube(3)# Output: 6 (3 + 1 * 2)
result2: str = tube(3)# Output: "6" str(3 + 1 * 2)
Contributions are welcome! If you find a bug or have a suggestion for improvement, please create an issue or a pull request on GitHub.
install .venv with all dev dep
make dev-install
launch tests
make test
launch linters
make lint
This library is licensed under the MIT License - see the LICENSE file for details.
- Async Support
- Parallel Processing / asyncio.gather / multiprocess
- Lazy Evaluation ?
- Input Validation, with type checking at runtime
- Hooks
- Timing and Profiling
- Caching ?