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()
 | 
