# Path: expremigen/patterns/pattern.py
# class Pattern(metaclass=abc.ABCMeta):
#     """
#     abstract base class for a Pattern
#     """
# 
#     def __str__(self):
#         return "{0}".format(self.__class__.__name__)
# 
#     def __repr__(self):
#         return self.__str__()
# 
# Path: expremigen/patterns/utils.py
# def flatten(l):
#     """
# 
#     :param l: list l
#     :return: iterator to flatten list l; Pchord are not flattened
#     """
#     for el in l:
#         if isinstance(el, Pattern) and not isinstance(el, Pchord):
#             yield from flatten(el)
#         else:
#             yield el


import copy
import itertools
import sys
from expremigen.patterns.pattern import Pattern
from expremigen.patterns.utils import flatten



class Pseq(Pattern):
    """
    pattern that generates numbers one by one from a list
    """

    def __init__(self, alist=None, repeats=sys.maxsize):
        super().__init__()
        if alist is None:
            alist = []
        self.alist = copy.deepcopy(alist)
        self.repeats = repeats

    def __iter__(self):

# Path: expremigen/patterns/pattern.py
# class Pattern(metaclass=abc.ABCMeta):
#     """
#     abstract base class for a Pattern
#     """
# 
#     def __str__(self):
#         return "{0}".format(self.__class__.__name__)
# 
#     def __repr__(self):
#         return self.__str__()
# 
# Path: expremigen/patterns/utils.py
# def flatten(l):
#     """
# 
#     :param l: list l
#     :return: iterator to flatten list l; Pchord are not flattened
#     """
#     for el in l:
#         if isinstance(el, Pattern) and not isinstance(el, Pchord):
#             yield from flatten(el)
#         else:
#             yield el


# Path: expremigen/patterns/pseq.py
import copy
import itertools
import sys
from expremigen.patterns.pattern import Pattern
from expremigen.patterns.utils import flatten




class Pseq(Pattern):
    """
    pattern that generates numbers one by one from a list
    """

    def __init__(self, alist=None, repeats=sys.maxsize):
        super().__init__()
        if alist is None:
            alist = []
        self.alist = copy.deepcopy(alist)
        self.repeats = repeats

    def __iter__(self):

        return flatten(j for i in itertools.repeat(self.alist, self.repeats) for j in i)