Skip to main content

Convert iterators into peekable, pushable iterators

Project description

Package Description

CI Documentation Status

This is a Python package that provides a simple class Pushable that creates "pushable" iterators by wrapping an inner iterator/iterable. Pushable iterators act like dynamically expanding queues, allowing you to peek ahead or push items back onto the queue.

Basic Usage

We can turn any iterable/iterator into a pushable iterator using the constructor.

count_up = Pushable( range( 0, 5 ) )

We can use it like an ordinary iterator:

print( next( count_up ) )
# Prints 0

Or we can look-ahead to see what is coming:

whats_up_next = count_up.peek()
print( whats_up_next )
# Print 1
print( next( count_up ) )
# Also prints 1 because peek does not remove the item from the internal queue.

We can even push back items onto it:

count_up.push("cat")
count_up.push("dog")
print( list( count_up ) )
# Prints 'dog', 'cat', 2, 3, 4

Examples

From an iterator such as a file-object, which will iterate over the lines in a file, create a peekable/pushable iterator. This can be useful for example when we want to know if the iterator still has contents or want a sneak peek at what is coming.

from pushable import Pushable

def read_upto_two_blank_lines( filename ):
    with open( filename ) as file:
        plines = Pushable( file )
        # Pushable iterators can be used as booleans in the natural way.
        while plines:
            line = next( plines )
            # peekOr makes it safe to look ahead.
            if line == '\n' and plines.peekOr() == '\n':
                # Two blank lines encountered.
                break
            else:
                yield line        

It is also useful to perform "macro-like" transformation.

from pushable import Pushable

def translate( text, translations ):
    ptokens = Pushable( text.split() )
    while ptokens:
        token = next(ptokens)
        if token in translations:
            ptokens.multiPush( *translations[token].split() )
        else:
            yield token

print( ' '.join( translate( 'My name is MYNAME', {'MYNAME':'Fred Bloggs'} ) ) ) 
# Prints: My name is Fred Bloggs

More Complex Uses

In addition to peeking and popping items, which risks raising a StopIteration exception if there's nothing left on the internal queue, we can utilise peekOr and popOr to deliver a default value instead. The default value is passed as an optional parameter and falls back to None.

We can also peek and pop multiple values using multiPeekOr and multiPopOr, which return generators. These support skipping over values so that you can get the 2nd and 3rd value without getting the first e.g.

(second, third) = Pushable("pqr").multiPop(skip=1, count=2)
print( second, third )
# Prints: q r

Lastly, we can push multiple items with multiPush:

count_up.multiPush("cat", "dog", "rabbit")
print( list( count_up ) )
# Prints: ['cat', 'dog', 'rabbit']

For a full set of available methods see the documentation.

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

pushable-0.1.9.tar.gz (54.5 kB view details)

Uploaded Source

Built Distribution

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

pushable-0.1.9-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

File details

Details for the file pushable-0.1.9.tar.gz.

File metadata

  • Download URL: pushable-0.1.9.tar.gz
  • Upload date:
  • Size: 54.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pushable-0.1.9.tar.gz
Algorithm Hash digest
SHA256 e499ae3372dc24e5ab9f41111ac1f479931272da7cd6a85e8194dae9d46baeee
MD5 4cca275ce19cb3f3e23eec9228481521
BLAKE2b-256 606b21317d75f94277b7095e571c9f473c0669151a848173489c9037b52f6a20

See more details on using hashes here.

File details

Details for the file pushable-0.1.9-py3-none-any.whl.

File metadata

  • Download URL: pushable-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 17.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pushable-0.1.9-py3-none-any.whl
Algorithm Hash digest
SHA256 86bd69bae28902947d0b9937cd7080a1d153a9edb0b675609b12752314e13076
MD5 b871c15a1749d30efda397db218e04fb
BLAKE2b-256 b8ba1a284c695f51e0362d6bcb843aa68b0907994e0d4370ff65799ed9ee5709

See more details on using hashes here.

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