File size: 1,690 Bytes
8287b2e
6e18947
345e36f
9d5b4c0
6e18947
 
345e36f
 
 
 
6e18947
345e36f
 
6e18947
 
345e36f
6e18947
 
345e36f
 
6e18947
345e36f
 
 
9d5b4c0
6e18947
 
345e36f
 
6e18947
345e36f
 
 
6e18947
345e36f
 
69834b6
6e18947
345e36f
 
69834b6
6e18947
345e36f
 
 
 
6e18947
345e36f
 
6e18947
345e36f
69834b6
6e18947
345e36f
69834b6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from typing import Any, Dict, List

from .dataclass import Dataclass, OptionalField
from .utils import deepcopy


class ReusableGenerator(Dataclass):
    generator: callable
    gen_argv: List[Any] = OptionalField(default_factory=list)
    gen_kwargs: Dict[str, Any] = OptionalField(default_factory=dict)

    def activate(self):
        return self.generator(*self.gen_argv, **self.gen_kwargs)

    def __iter__(self):
        yield from self.activate()

    def __call__(self):
        yield from iter(self)


class CopyingReusableGenerator(ReusableGenerator):
    def __iter__(self):
        for instance in self.activate():
            yield deepcopy(instance)


# if __name__ == "__main__":
#     from itertools import chain, islice

#     # Creating objects of MyIterable
#     iterable1 = ReusableGenerator(range, gen_argv=[1, 4])
#     iterable2 = ReusableGenerator(range, gen_argv=[4, 7])

#     # Using itertools.chain
#     chained = list(chain(iterable1, iterable2))
#     logger.info(chained)  # Prints: [1, 2, 3, 4, 5, 6]

#     # Using itertools.islice
#     sliced = list(islice(ReusableGenerator(range, gen_argv=[1, 7]), 1, 4))
#     logger.info(sliced)  # Prints: [2, 3, 4]

#     # now same test with generators
#     def generator(start, end):
#         for i in range(start, end):
#             yield i

#     iterable1 = ReusableGenerator(generator, gen_argv=[1, 4])
#     iterable2 = ReusableGenerator(generator, gen_argv=[4, 7])

#     chained = list(chain(iterable1, iterable2))
#     logger.info(chained)  # Prints: [1, 2, 3, 4, 5, 6]

#     sliced = list(islice(ReusableGenerator(generator, gen_argv=[1, 7]), 1, 4))
#     logger.info(sliced)  # Prints: [2, 3, 4]