Skip to main content

Convert iterators into peekable, pushable iterators

Project description

Package Description

CircleCI 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.8.tar.gz (16.4 kB view details)

Uploaded Source

Built Distribution

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

Uploaded Python 3

File details

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

File metadata

  • Download URL: pushable-0.1.8.tar.gz
  • Upload date:
  • Size: 16.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.10.12 Linux/6.5.0-10043-tuxedo

File hashes

Hashes for pushable-0.1.8.tar.gz
Algorithm Hash digest
SHA256 3f0bbdb9acf0bfd3a5c53df8388ad6c3328bb594ac532e48e7c0ea487a73554e
MD5 80befa0963fa180b2fb6eaa4fac1675a
BLAKE2b-256 d36a45620d7c5052920e2317a583f80262d6a81b8c2cb2ef4ecd04dda598b8c3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pushable-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 17.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.10.12 Linux/6.5.0-10043-tuxedo

File hashes

Hashes for pushable-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 4e2de0e2c09232cb897548f57b0994e358262a65719c62bc23178802a31fcda1
MD5 a54d3e0267dff25325cfdf59a0beb926
BLAKE2b-256 a9574a7382916f60ea715ee04bc8c063496e166d1712ce75137945af7e72a417

See more details on using hashes here.

Supported by

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