File size: 1,541 Bytes
bb6d2aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

from dataclasses import dataclass, field
from typing import Any


@dataclass(eq=False)
class StapleState:
    sequence_tokens: list[str]
    anchor_pair: tuple[int, int] | None = None
    block_id: str | None = None
    topology: str = "linear"
    metadata: dict[str, Any] = field(default_factory=dict)

    @classmethod
    def from_sequence(cls, seq: str, **kwargs: Any) -> "StapleState":
        return cls(sequence_tokens=list(seq), **kwargs)

    def to_sequence(self) -> str:
        return "".join(self.sequence_tokens)

    def copy(self) -> "StapleState":
        return StapleState(
            sequence_tokens=self.sequence_tokens.copy(),
            anchor_pair=None if self.anchor_pair is None else tuple(self.anchor_pair),
            block_id=self.block_id,
            topology=self.topology,
            metadata=dict(self.metadata),
        )

    def __hash__(self) -> int:
        return hash((tuple(self.sequence_tokens), self.anchor_pair, self.block_id, self.topology))

    def __eq__(self, other: object) -> bool:
        if not isinstance(other, StapleState):
            return False
        return (
            self.sequence_tokens == other.sequence_tokens
            and self.anchor_pair == other.anchor_pair
            and self.block_id == other.block_id
            and self.topology == other.topology
        )

    def __str__(self) -> str:
        return f"StapleState(seq={self.to_sequence()}, anchor={self.anchor_pair}, block={self.block_id}, topo={self.topology})"