11"""This package provides a type representing a generator or an integer.
22"""
33from typing import Generator
4+ from ptrlib .types import PtrlibIntLikeT
45
56
67class GeneratorOrInt :
@@ -20,34 +21,51 @@ class GeneratorOrInt:
2021 def __init__ (self , generator : Generator [int , None , None ], symbol : bytes = b'' ):
2122 self ._generator = generator
2223 self ._symbol = symbol
23- self ._first = None
24+ self ._cache = []
25+ self ._cursor = 0
2426
25- @property
26- def generator (self ) -> Generator [int , None , None ]:
27- """Get generator
27+ def __getitem__ (self , index : PtrlibIntLikeT ):
28+ """Get n-th value of the generator
2829 """
29- return self ._generator
30+ index = int (index )
31+
32+ if index >= len (self ._cache ):
33+ for _ in range (index + 1 - len (self ._cache )):
34+ self ._cache .append (next (self ._generator ))
35+
36+ return self ._cache [index ]
3037
3138 def __int__ (self ) -> int :
32- if self ._first is None :
33- v = next (self ._generator )
34- self ._first = v
35- return v
36- return self ._first
39+ """Get the first value of the generator
40+ """
41+ return self [0 ]
42+
43+ def __index__ (self ) -> int :
44+ """Get the first value of the generator
45+ """
46+ return int (self )
3747
3848 def __iter__ (self ) -> 'GeneratorOrInt' :
3949 return self
4050
4151 def __next__ (self ) -> int :
42- v = next (self ._generator )
43- if self ._first is None :
44- self ._first = v
45- return v
52+ """Get next value
53+ """
54+ self ._cursor += 1
55+
56+ if self ._cursor - 1 < len (self ._cache ):
57+ return self ._cache [self ._cursor - 1 ]
58+
59+ self ._cache .append (next (self ._generator ))
60+ return self ._cache [- 1 ]
4661
4762 def __str__ (self ) -> str :
48- if self ._first is None :
63+ if len ( self ._cache ) == 0 :
4964 return f'GeneratorOrInt({ repr (self ._symbol )} )'
50- return f'GeneratorOrInt({ repr (self ._symbol )} @ { hex (self ._first )} )'
65+ if len (self ._cache ) == 1 :
66+ return f'GeneratorOrInt({ repr (self ._symbol )} @ { hex (self ._cache [0 ])} )'
67+ return f'GeneratorOrInt({ repr (self ._symbol )} @ { hex (self ._cache [0 ])} ' \
68+ f'and { len (self ._cache ) - 1 } more known values)'
5169
5270
5371__all__ = ['GeneratorOrInt' ]
0 commit comments