{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-} module GLDriver ( Driver(..) , SomeDriver(..) , Event , SomeEvent(..) , fromEvent , QuitEvent(..) , ResizeEvent(..) , Key(..) , KeyPressEvent(..) , KeyReleaseEvent(..) ) where import Data.Typeable class Driver a where initialized :: a -> Bool initGL :: a -> IO a deinitGL :: a -> IO () swapBuffers :: a -> IO () nextEvent :: a -> IO (Maybe SomeEvent) data SomeDriver = forall d. Driver d => SomeDriver d instance Driver SomeDriver where initialized (SomeDriver d) = initialized d initGL (SomeDriver d) = initGL d >>= return . SomeDriver deinitGL (SomeDriver d) = deinitGL d swapBuffers (SomeDriver d) = swapBuffers d nextEvent (SomeDriver d) = nextEvent d class (Typeable a, Show a) => Event a data SomeEvent = forall a. Event a => SomeEvent a instance Show SomeEvent where show (SomeEvent a) = show a fromEvent :: Event a => SomeEvent -> Maybe a fromEvent (SomeEvent a) = cast a data QuitEvent = QuitEvent deriving (Typeable, Show) instance Event QuitEvent data ResizeEvent = ResizeEvent Int Int deriving (Typeable, Show) instance Event ResizeEvent data Key = KeyLeft | KeyRight | KeyUp | KeyDown deriving (Eq, Ord, Show) data KeyPressEvent = KeyPressEvent Key deriving (Typeable, Show) instance Event KeyPressEvent data KeyReleaseEvent = KeyReleaseEvent Key deriving (Typeable, Show) instance Event KeyReleaseEvent