1818from effectful .ops .semantics import handler
1919from effectful .ops .types import NotHandled
2020
21- type Step = tuple [int , int ]
21+ type Move = tuple [int , int ]
22+
23+
24+ class Step (ABC ):
25+ @property
26+ @abstractmethod
27+ def start (self ) -> int :
28+ raise NotImplementedError
29+
30+ @property
31+ @abstractmethod
32+ def end (self ) -> int :
33+ raise NotImplementedError
2234
2335
2436@dataclass (frozen = True )
@@ -34,12 +46,12 @@ class GameState:
3446
3547 @classmethod
3648 def new (cls , size : int ) -> "GameState" :
37- towers = [[] for _ in range (size )]
49+ towers : list [ list [ int ]] = [[] for _ in range (size )]
3850 towers [0 ] = list (reversed (range (size )))
39- towers = tuple (tuple (tower ) for tower in towers )
40- return cls (size , towers )
51+ state : tuple [ tuple [ int , ...], ...] = tuple (tuple (tower ) for tower in towers )
52+ return cls (size , state )
4153
42- def visualise_image (self ) -> Image :
54+ def visualise_image (self ) -> Image . Image :
4355 "Uses python graphics libraries to visualise the state of the hanoi game."
4456 tower_width = 150
4557 disk_height = 30
@@ -100,7 +112,7 @@ def visualise(self):
100112 img = self .visualise_image ()
101113 img .show ()
102114
103- def apply (self , step : Step ) -> Optional ["GameState" ]:
115+ def apply (self , step : Move ) -> Optional ["GameState" ]:
104116 """
105117 Given a tower `start` and a target tower `end` moves the topmost disk to the end tower.
106118 """
@@ -134,7 +146,7 @@ def is_done(self) -> bool:
134146 for i in range (len (self .towers [- 1 ]) - 1 )
135147 )
136148
137- def valid_steps (self ) -> list [Step ]:
149+ def valid_steps (self ) -> list [Move ]:
138150 steps = []
139151 for i , tower_i in enumerate (self .towers ):
140152 for j , tower_j in enumerate (self .towers ):
@@ -148,23 +160,11 @@ def valid_steps(self) -> list[Step]:
148160 return steps
149161
150162
151- class Step (ABC ):
152- @property
153- @abstractmethod
154- def start (self ) -> int :
155- raise NotImplementedError
156-
157- @property
158- @abstractmethod
159- def end (self ) -> int :
160- raise NotImplementedError
161-
162-
163163def build_validated_model (game_state : GameState ) -> type [Step ]:
164164 valid_steps = game_state .valid_steps ()
165165
166166 @pydantic .dataclasses .dataclass (frozen = True )
167- class StepModel :
167+ class StepModel ( Step ) :
168168 start : int
169169 end : int
170170 explanation : str = ""
@@ -191,11 +191,11 @@ def __hash__(self):
191191 return StepModel
192192
193193
194- def predict_next_step (game_state : GameState ) -> Step :
194+ def predict_next_step (game_state : GameState ) -> Move :
195195 ValidStep = build_validated_model (game_state )
196196
197197 @Template .define
198- def predict_next_step_inner (game_state ) -> ValidStep :
198+ def predict_next_step_inner (game_state ) -> ValidStep : # type: ignore
199199 """
200200 Given the state of the game of towers of Hanoi as follows:
201201
0 commit comments