2016-10-31 22:47:16 +00:00
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving, DeriveFunctor #-}
|
2016-03-25 15:58:46 +00:00
|
|
|
module Affection.Types
|
2016-10-31 22:47:16 +00:00
|
|
|
( AffectionData(..)
|
|
|
|
, AffectionConfig(..)
|
2016-11-02 00:14:53 +00:00
|
|
|
, AffectionState(..)
|
2016-10-31 22:47:16 +00:00
|
|
|
-- , AffectionDraw(..)
|
|
|
|
-- , Draw(..)
|
|
|
|
, AffectionStateInner(..)
|
|
|
|
-- , AffectionDrawInner(..)
|
|
|
|
, InitComponents(..)
|
|
|
|
-- , Loop(..)
|
|
|
|
, RGBA(..)
|
|
|
|
, SDL.WindowConfig(..)
|
|
|
|
, SDL.defaultWindow
|
2016-03-25 15:58:46 +00:00
|
|
|
) where
|
|
|
|
|
2016-10-31 22:47:16 +00:00
|
|
|
import qualified SDL.Init as SDL
|
|
|
|
import qualified SDL.Video as SDL
|
|
|
|
import qualified Data.Text as T
|
|
|
|
|
|
|
|
import Control.Monad.IO.Class
|
|
|
|
import Control.Monad.State
|
|
|
|
import Control.Monad.Reader
|
|
|
|
|
|
|
|
import Control.Concurrent.MVar
|
|
|
|
|
|
|
|
-- | Configuration for the aplication. needed at startup.
|
|
|
|
data AffectionConfig us = AffectionConfig
|
|
|
|
{ initComponents :: InitComponents -- ^ SDL components to initialize at startup
|
|
|
|
, windowTitle :: T.Text -- ^ Window title
|
|
|
|
, windowConfig :: SDL.WindowConfig -- ^ Window configuration
|
|
|
|
, drawLoop :: AffectionState (AffectionData us) IO (IO ()) -- ^ Some function. Type to be determined.
|
2016-11-02 00:14:53 +00:00
|
|
|
, updateLoop :: Double -> AffectionState (AffectionData us) IO (IO ()) -- ^ main update function. Takes nanoseconds as input.
|
2016-10-31 22:47:16 +00:00
|
|
|
, userData :: us
|
|
|
|
}
|
|
|
|
|
|
|
|
-- | Main type for defining the look, feel and action of the whole application.
|
|
|
|
data AffectionData us = AffectionData
|
|
|
|
{ affectionConfig :: AffectionConfig us -- ^ Application configuration.
|
|
|
|
, quitEvent :: Bool -- ^ Loop breaker.
|
|
|
|
, userState :: us -- ^ State data provided by user
|
|
|
|
, drawWindow :: SDL.Window -- ^ SDL window
|
|
|
|
, drawSurface :: SDL.Surface -- ^ SDL surface
|
|
|
|
}
|
|
|
|
|
|
|
|
-- -- | Data and surfaces for drawing.
|
|
|
|
-- data AffectionDraw dd = AffectionDraw
|
|
|
|
-- }
|
|
|
|
|
|
|
|
-- | Components to initialize in SDL.
|
|
|
|
data InitComponents
|
|
|
|
= All
|
|
|
|
| Only [SDL.InitFlag]
|
|
|
|
|
|
|
|
-- | Inner 'StateT' monad for the update state
|
2016-11-02 00:14:53 +00:00
|
|
|
-- type AffectionStateInner us m a = StateT (AffectionData us) m a
|
|
|
|
type AffectionStateInner us m a = StateT us m a
|
2016-10-31 22:47:16 +00:00
|
|
|
|
|
|
|
-- | Affection's state monad
|
|
|
|
newtype AffectionState us m a = AffectionState
|
|
|
|
{ runState :: AffectionStateInner us m a }
|
2016-11-02 00:14:53 +00:00
|
|
|
deriving (Functor, Applicative, Monad, MonadIO, MonadState us)
|
2016-10-31 22:47:16 +00:00
|
|
|
|
|
|
|
-- -- | Inner 'StateT' monad of Affection
|
|
|
|
-- type AffectionInner us od a = StateT (AffectionState us od) IO a
|
|
|
|
--
|
|
|
|
-- -- | Affection state monad
|
|
|
|
-- newtype Affection us od a = Affection
|
|
|
|
-- { runAffection :: AffectionInner us od a }
|
|
|
|
-- deriving (Functor, Applicative, Monad, MonadState (AffectionState us od))
|
|
|
|
--
|
|
|
|
-- -- | Inner drawing monad of Affection.
|
|
|
|
-- type AffectionDrawInner ds a = ReaderT (Draw ds) a
|
|
|
|
--
|
|
|
|
-- -- | Affectiondrawinf reader monad.
|
|
|
|
-- newtype AffectionDraw ds a = AffectionDraw
|
|
|
|
-- { runDraw :: (ds -> a) }
|
|
|
|
-- deriving (Functor, Applicative, Monad, MonadReader ds)
|
|
|
|
--
|
|
|
|
-- -- | Loop state monad to hold elapsed time per frame
|
|
|
|
-- newtype Loop f a = Loop
|
|
|
|
-- { runLoop :: f -> (a, f) }
|
|
|
|
-- deriving (Functor, Applicative, Monad, MonadState (Loop f))
|
|
|
|
|
2016-03-26 08:33:38 +00:00
|
|
|
data RGBA = RGBA
|
|
|
|
{ r :: Int
|
|
|
|
, g :: Int
|
|
|
|
, b :: Int
|
|
|
|
, a :: Int
|
|
|
|
}
|