Metadata-Version: 2.1
Name: aiomemoize
Version: 0.0.1
Summary: Memoize asyncio Python function calls
Home-page: https://github.com/michalc/aiomemoize
Author: Michal Charemza
Author-email: michal@charemza.name
License: UNKNOWN
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Framework :: AsyncIO
Requires-Python: ~=3.5
Description-Content-Type: text/markdown

# aiomemoize [![CircleCI](https://circleci.com/gh/michalc/aiomemoize.svg?style=svg)](https://circleci.com/gh/michalc/aiomemoize) [![Test Coverage](https://api.codeclimate.com/v1/badges/82f9a346683c411b08a6/test_coverage)](https://codeclimate.com/github/michalc/aiomemoize/test_coverage)

Memoize asyncio Python calls. Invalidation is manual/explicit for each set of arguments, although exceptions raised are _not_ cached. This can be used for coroutines, and functions that return a promise.


## Installation

```base
pip install aiomemoize
```


## Usage

For a coroutine whose arguments are hashable, you can create a _memoized_ version by passing it to `memoize`. Any calls to this version that have the same arguments will result in only a _single_ run of original coroutine.

For example, the below

```python
import asyncio
from aiomemoize import memoize

async def main():
    memoized, invalidate = memoize(coro)
    results = await asyncio.gather(*[
        memoized('a'),
        memoized('a'),
        memoized('b'),
    ])
    print(results)

    invalidate('a')
    results = await asyncio.gather(*[
        memoized('a'),
        memoized('a'),
        memoized('b'),
    ])
    print(results)

    await memoized('a')

async def coro(value):
    print('Inside coro', value)
    await asyncio.sleep(1)
    return value

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
```

will output

```
Inside coro a
Inside coro b
['a', 'a', 'b']
Inside coro a
['a', 'a', 'b']
```


