Metadata-Version: 2.0
Name: chainlet
Version: 1.1.0
Summary: Framework for linking generators/iterators to processing chains, trees and graphs
Home-page: https://github.com/maxfischer2781/chainlet
Author: Max Fischer
Author-email: maxfischer2781@gmail.com
License: MIT
Keywords: chaining generator coroutine stream pipeline chain bind tree graph
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: System :: Monitoring
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.4
Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6

++++++++
chainlet
++++++++

The ``chainlet`` library offers a lightweight model to create processing pipelines from
generators, coroutines, functions and custom objects.
Instead of requiring you to nest code or insert hooks, ``chainlet`` offers a concise, intuitive binding syntax:

.. code:: python

    # regular nested generators
    csv_writer(flatten(xml_reader(path='data.xml'), join='.'.join), path='data.csv')
    # chainlet pipeline
    xml_reader(path='data.xml') >> flatten(join='.'.join) >> csv_writer(path='data.csv')

Creating new chainlets is simple, requiring you only to define the processing of data.
It is usually sufficient to use regular functions, generators or coroutines, and let ``chainlet`` handle the rest:

.. code:: python

    @chainlet.genlet
    def moving_average(window_size=8):
        buffer = collections.deque([(yield)], maxlen=window_size)
        while True:
            new_value = yield(sum(buffer)/len(buffer))
            buffer.append(new_value)

Features
========

We have designed ``chainlet`` to be a simple, intuitive library:

* Modularize your code with small, independent processing blocks.
* Intuitively compose processing pipelines from individual elements.
* Automatically integrate functions, generators and coroutines in your pipelines.
* Extend your processing with complex pipelines that fork and join as needed.

Under the hood, ``chainlet`` merges iterator and functional paradigms in a minimal fashion to stay lightweight.

* Fully compliant with the Generator interface to integrate with existing code.
* Implicit tail recursion elimination for linear pipelines, and premature end of chain traversal.
* Push and pull chains iteratively, continuously, or even asynchronously.
* Simple interface to extend or supersede pipeline traversal and processing.

At its heart ``chainlet`` strives to be as Pythonic as possible:
You write python, and you get python.
No trampolines, callbacks, stacks, handlers, ...

We take care of the ugly bits so you do not have to.

Looking to get started?
Check out our docs: |docs|

Found an issue or have suggestions?
Head straight to our issue tracker: |issues|

Status
======

We use the ``chainlet`` library in a production environment.
It serves to configure and drive stream based data extraction and translation for monitoring.
Both the grammar and general interfaces for processing chains, trees and graphs are stable.

Ongoing work is mainly focused on the iteration interface.
We plan to add automatic concurrency, asynchronicity and parallelism.
Our target is an opt-in approach to features from functional programming and static optimisations.

Recent Changes
--------------

v1.1.0

    Added chainlet versions of builtins and protocol interfaces

v1.0.0

    Initial release

.. |docs| image:: https://readthedocs.org/projects/chainlet/badge/?version=latest
   :target: http://chainlet.readthedocs.io/en/latest/?badge=latest
   :alt: Documentation Status

.. |issues| image:: https://img.shields.io/github/issues/maxfischer2781/chainlet.svg
   :target: https://github.com/maxfischer2781/chainlet/issues
   :alt: Open Issues

