from __future__ import annotations from collections.abc import Callable, Hashable, Sequence from typing import overload __author__: str __license__: str __version__: str _EditopsList = list[tuple[str, int, int]] _OpcodesList = list[tuple[str, int, int, int, int]] _MatchingBlocks = list[tuple[int, int, int]] _AnyEditops = _EditopsList | _OpcodesList def inverse(edit_operations: list) -> list: ... @overload def editops(s1: Sequence[Hashable], s2: Sequence[Hashable]) -> _EditopsList: ... @overload def editops( ops: _AnyEditops, s1: Sequence[Hashable] | int, s2: Sequence[Hashable] | int, ) -> _EditopsList: ... @overload def opcodes(s1: Sequence[Hashable], s2: Sequence[Hashable]) -> _OpcodesList: ... @overload def opcodes( ops: _AnyEditops, s1: Sequence[Hashable] | int, s2: Sequence[Hashable] | int, ) -> _OpcodesList: ... def matching_blocks( edit_operations: _AnyEditops, source_string: Sequence[Hashable] | int, destination_string: Sequence[Hashable] | int, ) -> _MatchingBlocks: ... def subtract_edit(edit_operations: _EditopsList, subsequence: _EditopsList) -> _EditopsList: ... def apply_edit(edit_operations: _AnyEditops, source_string: str, destination_string: str) -> str: ... def median(strlist: list[str | bytes], wlist: list[float] | None = None) -> str: ... def quickmedian(strlist: list[str | bytes], wlist: list[float] | None = None) -> str: ... def median_improve( string: str | bytes, strlist: list[str | bytes], wlist: list[float] | None = None, ) -> str: ... def setmedian(strlist: list[str | bytes], wlist: list[float] | None = None) -> str: ... def setratio(strlist1: list[str | bytes], strlist2: list[str | bytes]) -> float: ... def seqratio(strlist1: list[str | bytes], strlist2: list[str | bytes]) -> float: ... def distance( s1: Sequence[Hashable], s2: Sequence[Hashable], *, weights: tuple[int, int, int] | None = (1, 1, 1), processor: Callable[..., Sequence[Hashable]] | None = None, score_cutoff: float | None = None, score_hint: float | None = None, ) -> int: ... def ratio( s1: Sequence[Hashable], s2: Sequence[Hashable], *, processor: Callable[..., Sequence[Hashable]] | None = None, score_cutoff: float | None = None, ) -> float: ... def hamming( s1: Sequence[Hashable], s2: Sequence[Hashable], *, pad: bool = True, processor: Callable[..., Sequence[Hashable]] | None = None, score_cutoff: float | None = None, ) -> int: ... def jaro( s1: Sequence[Hashable], s2: Sequence[Hashable], *, processor: Callable[..., Sequence[Hashable]] | None = None, score_cutoff: float | None = None, ) -> float: ... def jaro_winkler( s1: Sequence[Hashable], s2: Sequence[Hashable], *, prefix_weight: float | None = 0.1, processor: Callable[..., Sequence[Hashable]] | None = None, score_cutoff: float | None = None, ) -> float: ...