Skip to main content

Stream4Py: Functional, chainable streams for Python with lazy evaluation

Project description

Stream4Py

PyPI - Version PyPI - Python Version pre-commit.ci status

A Python library inspired by Java Streams, Haskell lists, and Linux pipes, providing a powerful, lazy-evaluated Stream class for functional-style data manipulation. Stream4Py makes it easy to work with iterables, files, subprocess output, and general data pipelines.


Features

  • Lazy and eager evaluation methods.
  • Chainable operations like map, filter, flat_map, unique, enumerate, flatten, sections.
  • File parsing and subprocess piping with from_io and pipe.
  • Collection helpers like to_list, to_dict, to_set, and cache.
  • Built-in itertools utilities (islice, zip_longest, accumulate, etc.).
  • Inspired by Java Streams, Haskell functional programming, and Python itertools.

Installation

Install via pip:

pip install stream4py

Quick Start

from stream4py import Stream

# Create a stream
s = Stream([1, 2, 3, 4, 5])

# Lazy operations
result = (
    s.filter(lambda x: x % 2 == 0)
     .map(lambda x: x * 10)
     .unique()
)

# Convert to list (triggers evaluation)
print(result.to_list())  # [20, 40]

# Stream lines from a file
lines = Stream.from_io(open("file.txt"))
lines.filter(lambda x: "error" in x).for_each(print)

# Subprocess streaming
Stream.subprocess_run(("seq", "100")).pipe(("grep", "1")).for_each(print)

Quick Reference

Method Type Description Example
map(func) Lazy Apply a function to each item Stream([1,2,3]).map(lambda x: x*2)
filter(predicate) Lazy Keep items satisfying a predicate Stream([1,2,3]).filter(lambda x: x>1)
filterfalse(predicate) Lazy Keep items for which predicate is False Stream([1,2,3]).filterfalse(lambda x: x>1)
flat_map(func) Lazy Map then flatten iterables Stream([1,2]).flat_map(lambda x: (x,x*10))
flatten() Lazy Flatten nested iterables Stream([[1,2],[3]]).flatten()
unique(key=None) Lazy Keep only unique items Stream([1,2,2]).unique()
type_is(cls) Lazy Keep items of a specific type Stream([1,'a']).type_is(int)
enumerate(start=0) Lazy Enumerate items Stream(['a','b']).enumerate(1)
peek(func) Lazy Apply function without changing items Stream([1,2]).peek(print)
islice(start, stop, step) Lazy Slice like itertools.islice Stream([1,2,3]).islice(1,3)
batched(size) Lazy Yield items in batches Stream(range(5)).batched(2)
drop(n) Lazy Drop first n items Stream([1,2,3]).drop(1)
take(n) Lazy Take first n items Stream([1,2,3]).take(2)
dropwhile(predicate) Lazy Drop items while predicate is true Stream([1,2,3]).dropwhile(lambda x: x<2)
takewhile(predicate) Lazy Take items while predicate is true Stream([1,2,3]).takewhile(lambda x: x<3)
reverse() Lazy Reverse the items Stream([1,2,3]).reverse()
zip(*iterables) Lazy Zip with other iterables Stream([1,2]).zip(['a','b'])
zip_longest(*iterables) Lazy Zip with padding Stream([1]).zip_longest([2,3])
accumulate(func=None, initial=None) Lazy Cumulative sums or function Stream([1,2,3]).accumulate()
subprocess_run(command) Lazy Run a subprocess and stream output Stream.subprocess_run(('ls',))
pipe(command) Lazy Pipe stream to subprocess Stream(['foo']).pipe(('grep','f'))
sum(start=0) Eager Sum all items Stream([1,2,3]).sum()
min(key=None, default=None) Eager Minimum value Stream([1,2,3]).min()
max(key=None, default=None) Eager Maximum value Stream([1,2,3]).max()
sorted(key=None, reverse=False) Eager Sort items Stream([3,1,2]).sorted()
first(default=None) Eager First item Stream([1,2]).first()
find(func) Eager Find first item matching function Stream([1,2,3]).find(lambda x: x>1)
group_by(key) Eager Group items by key Stream([1,2,3,4]).group_by(lambda x: x%2)
for_each(func) Eager Apply function to all items Stream([1,2]).for_each(print)
cache() Eager Cache stream items Stream(range(3)).cache()
to_list() Eager Collect as list Stream([1,2]).to_list()
to_tuple() Eager Collect as tuple Stream([1,2]).to_tuple()
to_set() Eager Collect as set Stream([1,2]).to_set()
to_dict() Eager Collect as dict (from tuples) Stream([(1,'a')]).to_dict()
collect(func) Eager Apply function to iterable Stream([1,2]).collect(sum)
from_io(io) Lazy Stream lines from file or binary IO Stream.from_io(open('file.txt'))
sections(predicate) Lazy Split into sections based on predicate Stream([1,1,2]).sections(lambda x:x==2)
range(start, stop, step=1) Lazy Stream over a range Stream.range(1,5)

Contributing

Contributions are welcome! Please open an issue or pull request with improvements or bug fixes.


License

stream4py is distributed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stream4py-0.1.0.tar.gz (16.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stream4py-0.1.0-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file stream4py-0.1.0.tar.gz.

File metadata

  • Download URL: stream4py-0.1.0.tar.gz
  • Upload date:
  • Size: 16.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for stream4py-0.1.0.tar.gz
Algorithm Hash digest
SHA256 482c210e0eedeaa5dbc067e64ea8b4f82dcb4c58c793c8b52c39294dd445c84a
MD5 425743426172b808e16ef4688ba98158
BLAKE2b-256 e11cf47c98904d979e27d375683b67395449267eb5a2ab4d4b9019ede2433c93

See more details on using hashes here.

Provenance

The following attestation bundles were made for stream4py-0.1.0.tar.gz:

Publisher: main.yaml on FlavioAmurrioCS/stream4py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stream4py-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: stream4py-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for stream4py-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e91305182159b5b9390975b8ab6add012546dfc2fc29596b0bc8ca232bf2beb4
MD5 c1b77e586484a7642b0b9ae5fd1eda76
BLAKE2b-256 991c6c7870fc42b404193125f1c4ed315e68d9580b815889fcf40b5aabb49039

See more details on using hashes here.

Provenance

The following attestation bundles were made for stream4py-0.1.0-py3-none-any.whl:

Publisher: main.yaml on FlavioAmurrioCS/stream4py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page