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