# Path: src/cutadapt/modifiers.py
# class ModificationInfo:
#     """
#     An object of this class is created for each read that passes through the pipeline.
#     Any information (except the read itself) that needs to be passed from one modifier
#     to one later in the pipeline or from one modifier to the filters is recorded here.
#     """
# 
#     __slots__ = ["matches", "original_read", "cut_prefix", "cut_suffix", "is_rc"]
# 
#     def __init__(self, read):
#         self.matches = []  # type: List[Match]
#         self.original_read = read
#         self.cut_prefix = None
#         self.cut_suffix = None
#         self.is_rc = None
# 
#     def __repr__(self):
#         return (
#             "ModificationInfo("
#             f"matches={self.matches!r}, "
#             f"original_read={self.original_read}, "
#             f"cut_prefix={self.cut_prefix}, "
#             f"cut_suffix={self.cut_suffix}, "
#             f"is_rc={self.is_rc})"
#         )


from abc import ABC, abstractmethod
from .qualtrim import expected_errors
from .modifiers import ModificationInfo
"""
Filtering criteria (predicates)
"""



class Predicate(ABC):
    @abstractmethod

# Path: src/cutadapt/modifiers.py
# class ModificationInfo:
#     """
#     An object of this class is created for each read that passes through the pipeline.
#     Any information (except the read itself) that needs to be passed from one modifier
#     to one later in the pipeline or from one modifier to the filters is recorded here.
#     """
# 
#     __slots__ = ["matches", "original_read", "cut_prefix", "cut_suffix", "is_rc"]
# 
#     def __init__(self, read):
#         self.matches = []  # type: List[Match]
#         self.original_read = read
#         self.cut_prefix = None
#         self.cut_suffix = None
#         self.is_rc = None
# 
#     def __repr__(self):
#         return (
#             "ModificationInfo("
#             f"matches={self.matches!r}, "
#             f"original_read={self.original_read}, "
#             f"cut_prefix={self.cut_prefix}, "
#             f"cut_suffix={self.cut_suffix}, "
#             f"is_rc={self.is_rc})"
#         )


# Path: src/cutadapt/filters.py
from abc import ABC, abstractmethod
from .qualtrim import expected_errors
from .modifiers import ModificationInfo

"""
Filtering criteria (predicates)
"""



class Predicate(ABC):
    @abstractmethod

    def test(self, read, info: ModificationInfo) -> bool: