{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-} module Player ( Player(..) , SomePlayer(..) ) where import Data.Fixed import Data.Typeable import Tank import GLDriver (SomeEvent) class Player a where playerMovement :: a -> Tank -> (a, Maybe Micro, Bool) handleEvent :: a -> SomeEvent -> a handleEvent player _ = player data SomePlayer = forall a. Player a => SomePlayer a instance Player SomePlayer where playerMovement (SomePlayer player) tank = (\(p, angle, move) -> (SomePlayer p, angle, move)) $ playerMovement player tank handleEvent (SomePlayer player) event = SomePlayer $ handleEvent player event