-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuilder_state.py
More file actions
49 lines (39 loc) · 1.42 KB
/
Copy pathbuilder_state.py
File metadata and controls
49 lines (39 loc) · 1.42 KB
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
47
48
49
from dataclasses import dataclass, field
from typing import List, Optional
from logic_core import Expr
@dataclass
class BuilderState:
pool: List[Expr] = field(default_factory=list) # elenco sotto-formule
phi_idx: Optional[int] = None # indice formula principale
undo: List[List[Expr]] = field(default_factory=list)
redo: List[List[Expr]] = field(default_factory=list)
def snapshot(self):
self.undo.append(self.pool.copy())
self.redo.clear()
def reset_to_vars(self, vars_: List[str]):
self.snapshot()
self.pool = list(vars_)
self.phi_idx = None
def push(self, e: Expr):
self.snapshot()
self.pool.append(e)
def delete_indices(self, idxs: List[int]):
if not idxs:
return
self.snapshot()
keep = [e for i, e in enumerate(self.pool) if i not in set(idxs)]
self.pool = keep
if self.phi_idx is not None and self.phi_idx >= len(self.pool):
self.phi_idx = len(self.pool) - 1 if self.pool else None
def set_phi(self, i: int):
self.phi_idx = max(0, min(i, len(self.pool) - 1)) if self.pool else None
def do_undo(self):
if not self.undo:
return
self.redo.append(self.pool.copy())
self.pool = self.undo.pop()
def do_redo(self):
if not self.redo:
return
self.undo.append(self.pool.copy())
self.pool = self.redo.pop()