Metadata-Version: 2.1
Name: poser
Version: 0.2.0
Summary: Dysfunctional programming in Python with all the side effects.
Home-page: https://github.com/deathbeds/poser
Author: deathbeds
Author-email: tony.fast@gmail.com
License: BSD-3-Clause
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: IPython
Classifier: Framework :: Jupyter
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.6
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: dataclasses
Requires-Dist: toolz
Requires-Dist: requests
Requires-Dist: joblib


> The readme is a work in progress.

[![Build Status](https://travis-ci.org/deathbeds/poser.svg?branch=master)](https://travis-ci.org/deathbeds/poser)[![Coverage Status](https://coveralls.io/repos/github/deathbeds/poser/badge.svg?branch=master)](https://coveralls.io/github/deathbeds/poser?branch=master)[![PyPI version](https://badge.fury.io/py/poser.svg)](https://badge.fury.io/py/poser)

# Be a `poser`

`poser` is a fluent interface for lazy, (dis)functional python programming.

        pip install poser

> _disfunctional programming_ === Functional programming with all the side effects.

# `poser` API


```python
    from poser import λ, Composition, Λ, watch
    from toolz.curried import *; from toolz.curried.operator import *
```

# Chainable function compositions

λ composes a higher-order function that will `pipe` a set of arguments and keywords through an ordered list of functions.


```python
    f = (
        λ.range()
        .map(
            λ.mul(10))
        .list())
```

This composition is compared below with a toolz.compose, toolz.pipe, and standard lib python.


```python
   assert f(10) \
        == compose(list, map(mul(10)), range)(10) \
        == pipe(10, range, map(mul(10)), list) \
        == list(map(mul(10), range(10)))
```

## The explicit api

The api above uses shortcuts to modules that a hasty programmer may prefer.  The explicit api accesses functions by their package names first.


```python
    g = λ.builtins.range().map(
        λ.operator.mul(10)
    ).builtins.list()
```

### Imports

`poser` will import modules if they are not available.  For example, if `pandas` is not __import__ed then `poser` will __import __ it.

    λ.pandas.DataFrame()

# Symbollic composition


```python
    assert (λ[range] * λ.mul(10) + list)(10) == f(10)
```


```python
    if __name__== '__main__':
        !jupyter nbconvert --to markdown readme.ipynb
        !ipython -m poser
```

    [NbConvertApp] Converting notebook readme.ipynb to markdown
    [NbConvertApp] Writing 1600 bytes to readme.md
    [NbConvertApp] Converting notebook poser.ipynb to python
    [NbConvertApp] Writing 14787 bytes to poser.py
    [1mreformatted poser.py[0m
    [1mAll done! ✨ 🍰 ✨[0m
    [1m1 file reformatted[0m.[0m
    Fixing /Users/tonyfast/poser/poser.py
    ]0;IPython: tonyfast/poserTestResults(failed=0, attempted=67)
    Name       Stmts   Miss Branch BrPart  Cover
    --------------------------------------------
    poser.py     196      0     69      0   100%
    parsing /Users/tonyfast/poser/poser.py...
    ]0;IPython: tonyfast/poser<IPython.core.display.SVG object>
    parsing /Users/tonyfast/poser/poser.py...
    <IPython.core.display.SVG object>



```python

```


