Paste number 71535: better? lru

Index of paste annotations: 1

Paste number 71535: better? lru
Pasted by: ltbarcly
When:1 year, 3 months ago
Share:Tweet this! | http://paste.lisp.org/+1J73
Channel:None
Paste contents:
Raw Source | XML | Display As
sentinal = object()
class LRU(object):
    """
    Implementation of a length-limited O(1) LRU queue.
    Built for and used by PyPE:
    http://pype.sourceforge.net
    Copyright 2003 Josiah Carlson.
    """
    def __init__(self, count, pairs=()):
        self.count = max(count, 2)
        self.d = {}

        self.first = None
        self.last = None

        for key, value in pairs:
            self[key] = value

    def __contains__(self, obj):
        return obj in self.d

    def _to_front(self, node):
        if node.prev:
            node.prev.next = node.next

            if node.next:
                node.next.prev = node.prev

            node.next = self.first
        node.prev = None
        self.first = node
        
    def __getitem__(self, obj):
        node = self.d[obj]
        self._to_front(node)
        return node.me[1]

    def __setitem__(self, key, val):
        d = self.d
        node = d.get(key, sentinal)
        if node is not sentinal:
            node.me = (key, val)
        else:
            node = Node(None, (key, val))
            d[key] = node

        self._to_front(node)

        if len(d) > self.count:
            self._remove(self.last)

    def _remove(self, node):
        if node.prev:
            node.prev.next = nobj.next
        else:
            self.first = node.next

        if node.next:
            node.next.prev = node.prev
        else:
            self.last = node.prev

        del self.d[node.me[0]]
        
    def __delitem__(self, key):
        node = self.d[key]
        self._remove(node)

    def __iter__(self):
        cur = self.first
        while cur != None:
            cur2 = cur.next
            yield cur.me[1]
            cur = cur2
    def iteritems(self):
        cur = self.first
        while cur != None:
            cur2 = cur.next
            yield cur.me
            cur = cur2
    def iterkeys(self):
        return iter(self.d)
    def itervalues(self):
        for i,j in self.iteritems():
            yield j
    def keys(self):
        return self.d.keys()

Annotations for this paste:

Annotation number 1: fix typo
Pasted by: ltbarcly
When:1 year, 3 months ago
Share:Tweet this! | http://paste.lisp.org/+1J73/1
Paste contents:
Raw Source | Display As
sentinal = object()
class LRU(object):
    """
    Implementation of a length-limited O(1) LRU queue.
    Built for and used by PyPE:
    http://pype.sourceforge.net
    Copyright 2003 Josiah Carlson.
    """
    def __init__(self, count, pairs=[]):
        self.count = max(count, 2)
        self.d = {}

        self.first = None
        self.last = None

        for key, value in pairs:
            self[key] = value

    def __contains__(self, obj):
        return obj in self.d

    def _to_front(self, node):
        if node.prev:
            node.prev.next = node.next

            if node.next:
                node.next.prev = node.prev

            node.next = self.first
        node.prev = None
        self.first = node
        
    def __getitem__(self, obj):
        node = self.d[obj]
        self._to_front(node)
        return node.me[1]

    def __setitem__(self, key, val):
        d = self.d
        node = d.get(key, sentinal)
        if node is not sentinal:
            node.me = (key, val)
        else:
            node = Node(None, (key, val))
            d[key] = node

        self._to_front(node)

        if len(d) > self.count:
            self._remove(self.last)

    def _remove(self, node):
        if node.prev:
            node.prev.next = node.next
        else:
            self.first = node.next

        if node.next:
            node.next.prev = node.prev
        else:
            self.last = node.prev

        del self.d[node.me[0]]
        
    def __delitem__(self, key):
        node = self.d[key]
        self._remove(node)

    def __iter__(self):
        cur = self.first
        while cur != None:
            cur2 = cur.next
            yield cur.me[1]
            cur = cur2
    def iteritems(self):
        cur = self.first
        while cur != None:
            cur2 = cur.next
            yield cur.me
            cur = cur2
    def iterkeys(self):
        return iter(self.d)
    def itervalues(self):
        for i,j in self.iteritems():
            yield j
    def keys(self):
        return self.d.keys()

Colorize as:
Show Line Numbers
Index of paste annotations: 1

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.