1# -*- coding: utf-8 -*-
2import collections
3import threading
4
5from .func import synchronized
6
7__all__ = ['LRU']
8
9class LRU(object):
10    """
11    Implementation of a length-limited O(1) LRU map.
12
13    Original Copyright 2003 Josiah Carlson, later rebuilt on OrderedDict.
14    """
15    def __init__(self, count, pairs=()):
16        self._lock = threading.RLock()
17        self.count = max(count, 1)
18        self.d = collections.OrderedDict()
19        for key, value in pairs:
20            self[key] = value
21
22    @synchronized()
23    def __contains__(self, obj):
24        return obj in self.d
25
26    def get(self, obj, val=None):
27        try:
28            return self[obj]
29        except KeyError:
30            return val
31
32    @synchronized()
33    def __getitem__(self, obj):
34        a = self.d[obj]
35        self.d.move_to_end(obj, last=False)
36        return a
37
38    @synchronized()
39    def __setitem__(self, obj, val):
40        self.d[obj] = val
41        self.d.move_to_end(obj, last=False)
42        while len(self.d) > self.count:
43            self.d.popitem(last=True)
44
45    @synchronized()
46    def __delitem__(self, obj):
47        del self.d[obj]
48
49    @synchronized()
50    def __len__(self):
51        return len(self.d)
52
53    @synchronized()
54    def pop(self,key):
55        return self.d.pop(key)
56
57    @synchronized()
58    def clear(self):
59        self.d.clear()
60