Files
kabuki/cacher.py

77 lines
1.7 KiB
Python

from collections import deque
from time import time
class Cacher:
def __init__(self):
self.caches = {}
def add_source(self, src, size=100):
name = src.name
if not src.is_connected:
raise RuntimeError(f"source NOT connected: {name}")
cache = self.add_cache(name, size=size)
src.add_callback(cache.callback_append)
return cache
def add_cache(self, name, size=100):
# key contains size in case multiple caches per name with different sizes are needed
key = (name, size)
caches = self.caches
try:
return caches[key]
except KeyError:
caches[key] = cache = Cache(size=size)
return cache
def __repr__(self):
return repr(self.caches)
class Cache:
def __init__(self, size=100):
self.size = size
self.times = deque(maxlen=size)
self.values = deque(maxlen=size)
def callback_append(self, value=None, **kwargs):
self.append(value)
def append(self, value):
self.times.append(time())
self.values.append(value)
@property
def xy(self):
return self.times, self.values
@property
def latest(self):
try:
return self.values[-1]
except IndexError:
return None
def __repr__(self):
n = len(self.times)
return f"Cache: {n} / {self.size}"
def set_size(self, size):
self.size = size
self.times = deque(self.times, maxlen=size)
self.values = deque(self.values, maxlen=size)
# need to create object here to share it between sessions
cacher = Cacher()
#TODO: copy data from existing cache for the same name but different size