summaryrefslogtreecommitdiff
path: root/sqlparse/utils.py
blob: fd6651a0412df0607d54bb23baa5f7e6399e5aea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
'''
Created on 17/05/2012

@author: piranna
'''


def memoize_generator(func):
    """Memoize decorator for generators

    Store `func` results in a cache according to their arguments as 'memoize'
    does but instead this works on decorators instead of regular functions.
    Obviusly, this is only useful if the generator will always return the same
    values for each specific parameters...
    """
    cache = {}

    def wrapped_func(*args, **kwargs):
        params = (args, kwargs)

        # Look if cached
        try:
            cached = cache[params]

        # Not cached, exec and store it
        except KeyError:
            # Reset the cache if we have too much cached entries and start over
            # In the future would be better to use an OrderedDict and drop the
            # Least Recent Used entries
            if len(cache) >= 10:
                cache.clear()

            cached = []

            for item in func(*args, **kwargs):
                cached.append(item)
                yield item

            cache[params] = cached

        # Cached, yield its items
        else:
            for item in cached:
                yield item

    return wrapped_func