from dataclasses import dataclass
from typing import Iterator

# kleine Hilfestellung mit `Str` kann man sowohl `str` als auch `String` meinen
type Str = 'String' | str

@dataclass
class String:
    
    def __post_init__(self, s: str) -> None:
        pass
    
    def __str__(self) -> str:
        pass
    
    def __add__(self, other: Str) -> 'String':
        pass
    
    def __radd__(self, other: Str) -> 'String':
        pass
    
    def __len__(self, other: Str) -> int:
        pass
    
    def __eq__(self, other: Str) -> bool:
        pass
    
    def __iter__(self) -> Iterator[chr]:
        pass
    
    def concat(self, other: Str) -> 'String':
        pass
    
    def contains(self, other: Str) -> bool:
        pass
    
    def substring(self, start: int, end: int) -> 'String':
        pass
    
    def strip(self, chars: Str = ' ' + '\n' + '\t' + '\r') -> 'String':
        pass
    
    def replace(self, old: Str, new: Str, count = -1) -> 'String':
        pass
    
    def add_prefix(self, prefix: Str) -> 'String':
        pass
    
    def add_suffix(self, suffix: Str) -> 'String':
        pass
    
    def join[T](self, xs: Iterator[T]) -> 'String':
        pass