module T3.Game ( module T3.Game.Core , module T3.Game.Class , module T3.Game.Types , run ) where import Prelude import T3.Game.Core import T3.Game.Class import T3.Game.Types run :: Game m => Board -> m () run b = play b X O play :: Game m => Board -> XO -> XO -> m () play b p0 p1 = do loc <- move p0 if not (valid loc b) then forfeit (Win p1) (Lose p0) else do let b' = insertXO loc p0 b step b' p0 loc case result b' of Unfinished -> play b' p1 p0 Winner _ -> end (Win p0) (Lose p1) Tie -> tie