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.2.1.tar.gz (54.3 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.2.1-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pushable-0.2.1.tar.gz
  • Upload date:
  • Size: 54.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","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.2.1.tar.gz
Algorithm Hash digest
SHA256 9943d0a9f2d682efc42d4137c733e81b1e3d72db9e068fad7f9f2877d36beb1d
MD5 2e664cdcf119646efd48b401a4e936c9
BLAKE2b-256 942a7642ab18db8fd47fe527ce6d209163bba3aa5a7f54e6bfc17a4c09ecb7dd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pushable-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 17.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","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.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a7ef8d3c0a1a7786e7cd43a2d5776288ff1f0eba4322c3e324c3aa95ae239a9e
MD5 6d78bc4eeca0116ead01220b4fb97290
BLAKE2b-256 5deec76117879b6ffbe2dfb7910449ee1501135c6736f4a7daafbe2ff7a966ce

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