64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# the caching decorator for helpers functions
							 | 
						||
| 
								 | 
							
								class VersionedCache(object):
							 | 
						||
| 
								 | 
							
								    __slots__ = ( 'cache', 'masterCache', 'nextSlot', 'size')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self):
							 | 
						||
| 
								 | 
							
								        self.cache = []
							 | 
						||
| 
								 | 
							
								        self.masterCache = {}
							 | 
						||
| 
								 | 
							
								        self.nextSlot = 0
							 | 
						||
| 
								 | 
							
								        self.size = 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def reset(self):
							 | 
						||
| 
								 | 
							
								        # reinit the whole cache
							 | 
						||
| 
								 | 
							
								        self.masterCache = {}
							 | 
						||
| 
								 | 
							
								        self.update(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def update(self, newKey):
							 | 
						||
| 
								 | 
							
								        cache = self.masterCache.get(newKey, None)
							 | 
						||
| 
								 | 
							
								        if cache is None:
							 | 
						||
| 
								 | 
							
								            cache = [ None ] * self.size
							 | 
						||
| 
								 | 
							
								            self.masterCache[newKey] = cache
							 | 
						||
| 
								 | 
							
								        self.cache = cache
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def decorator(self, func):
							 | 
						||
| 
								 | 
							
								        return self._decorate(func.__name__, self._new_slot(), func)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # for lambdas
							 | 
						||
| 
								 | 
							
								    def ldeco(self, func):
							 | 
						||
| 
								 | 
							
								        return self._decorate(func.__code__, self._new_slot(), func)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _new_slot(self):
							 | 
						||
| 
								 | 
							
								        slot = self.nextSlot
							 | 
						||
| 
								 | 
							
								        self.nextSlot += 1
							 | 
						||
| 
								 | 
							
								        self.size += 1
							 | 
						||
| 
								 | 
							
								        return slot
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _decorate(self, name, slot, func):
							 | 
						||
| 
								 | 
							
								        def _decorator(arg):
							 | 
						||
| 
								 | 
							
								            #ret = self.cache[slot]
							 | 
						||
| 
								 | 
							
								            #if ret is not None:
							 | 
						||
| 
								 | 
							
								            #    return ret
							 | 
						||
| 
								 | 
							
								            #else:
							 | 
						||
| 
								 | 
							
								                ret = func(arg)
							 | 
						||
| 
								 | 
							
								            #    self.cache[slot] = ret
							 | 
						||
| 
								 | 
							
								                return ret
							 | 
						||
| 
								 | 
							
								        return _decorator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Cache = VersionedCache()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class RequestCache(object):
							 | 
						||
| 
								 | 
							
								    def __init__(self):
							 | 
						||
| 
								 | 
							
								        self.results = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def request(self, request, *args):
							 | 
						||
| 
								 | 
							
								        return ''.join([request] + [str(arg) for arg in args])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def store(self, request, result):
							 | 
						||
| 
								 | 
							
								        self.results[request] = result
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def get(self, request):
							 | 
						||
| 
								 | 
							
								        return self.results[request] if request in self.results else None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def reset(self):
							 | 
						||
| 
								 | 
							
								        self.results.clear()
							 |