11from copy import copy
22from typing import TYPE_CHECKING
33
4- import itertools
4+ from sentry_sdk . _lru_cache import LRUCache
55
66if TYPE_CHECKING :
77 from typing import TypedDict
@@ -13,62 +13,23 @@ class FlagBuffer:
1313
1414 def __init__ (self , capacity ):
1515 # type: (int) -> None
16- self .buffer = [] # type: list[Flag]
16+ self .buffer = LRUCache ( capacity )
1717 self .capacity = capacity
18- self .ip = 0
19-
20- @property
21- def index (self ):
22- # type: () -> int
23- return self .ip % self .capacity
2418
2519 def clear (self ):
2620 # type: () -> None
27- self .buffer = []
28- self .ip = 0
21+ self .buffer = LRUCache (self .capacity )
2922
3023 def __copy__ (self ):
3124 # type: () -> FlagBuffer
3225 buffer = FlagBuffer (capacity = self .capacity )
3326 buffer .buffer = copy (self .buffer )
34- buffer .ip = self .ip
3527 return buffer
3628
3729 def get (self ):
3830 # type: () -> list[FlagData]
39- if self .ip >= self .capacity :
40- iterator = itertools .chain (
41- range (self .index , self .capacity ), range (0 , self .index )
42- )
43- return [self .buffer [i ].asdict for i in iterator ]
44- else :
45- return [flag .asdict for flag in self .buffer ]
31+ return [{"flag" : key , "result" : value } for key , value in self .buffer .get_all ()]
4632
4733 def set (self , flag , result ):
4834 # type: (str, bool) -> None
49- flag_ = Flag (flag , result )
50-
51- if self .ip >= self .capacity :
52- self .buffer [self .index ] = flag_
53- else :
54- self .buffer .append (flag_ )
55-
56- self .ip += 1
57-
58-
59- class Flag :
60- __slots__ = ("flag" , "result" )
61-
62- def __init__ (self , flag , result ):
63- # type: (str, bool) -> None
64- self .flag = flag
65- self .result = result
66-
67- def __copy__ (self ):
68- # type: () -> Flag
69- return Flag (self .flag , self .result )
70-
71- @property
72- def asdict (self ):
73- # type: () -> FlagData
74- return {"flag" : self .flag , "result" : self .result }
35+ self .buffer .set (flag , result )
0 commit comments