From 0e25adaa1821a67c06c2a4e5a9ae0e6d593e8ab0 Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Fri, 4 Jun 2021 16:00:13 +0200 Subject: [PATCH] added CacheView (single cache per source, one view on that cache per plot) --- kabuki/cacher.py | 49 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/kabuki/cacher.py b/kabuki/cacher.py index 539b1eb..a9b6202 100644 --- a/kabuki/cacher.py +++ b/kabuki/cacher.py @@ -1,4 +1,5 @@ -from collections import deque +import itertools +from collections import deque, defaultdict from time import time @@ -6,6 +7,7 @@ class Cacher: def __init__(self): self.caches = {} + self.views = defaultdict(list) def add_source(self, src, size=100): @@ -15,15 +17,18 @@ class Cacher: caches = self.caches try: - return caches[name] + cache = caches[name] except KeyError: caches[name] = cache = Cache(size=size) src.add_callback(cache.callback_append) - return cache + + view = CacheView(cache, size=size) + self.views[name].append(view) + return view def __repr__(self): - return repr(self.caches) + return repr(self.views) @@ -66,12 +71,40 @@ class Cache: +class CacheView: + + def __init__(self, cache, size=100): + self.cache = cache + self.size = size + + def __iter__(self): + return iter(self.data) + + @property + def data(self): + return tuple(get_last(i, self.size) for i in self.cache.data) + + def __repr__(self): + return f"CacheView ({self.size}) on {self.cache}" + + def set_size(self, size): + self.size = size + if size > self.cache.size: + print("Adjust cache size to view size...") + self.cache.set_size(size) + + + +def get_last(d, n): + stop = len(d) + start = stop - n + start = max(start, 0) + return list(itertools.islice(d, start, stop)) + + + # 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 - - -