module Gamgine.State.State where
import qualified Gamgine.Math.Vect as V
import qualified Gamgine.State.RenderState as RS
import qualified Gamgine.State.InputInfo as II
import qualified Gamgine.State.KeyInfo as KI
import qualified Gamgine.State.MouseInfo as MI

-- | an application state
data State a = State {
   -- | called when the state is entered,
   --   when Nothing is returned, than the state
   --   couldn't be entered
   forall a. State a -> MousePos -> a -> Maybe (a, State a)
enter :: II.MousePos -> a -> Maybe (a, State a),

   -- | called when the state is leaved
   forall a. State a -> a -> (a, State a)
leave :: a -> (a, State a),

   -- | called for each application update cycle
   forall a. State a -> a -> (a, State a)
update :: a -> (a, State a),

   -- | called for each frame rendering
   forall a. State a -> RenderState -> a -> IO (a, State a)
render :: RS.RenderState -> a -> IO (a, State a),

   -- | called when a key was pressed/released
   forall a. State a -> KeyInfo -> a -> (a, State a)
keyEvent :: KI.KeyInfo -> a -> (a, State a),

   -- | called when a mouse button was pressed/released
   forall a. State a -> MouseInfo -> a -> (a, State a)
mouseEvent :: MI.MouseInfo -> a -> (a, State a),

   -- | called when a mouse was moved
   forall a. State a -> MousePos -> a -> (a, State a)
mouseMoved :: II.MousePos -> a -> (a, State a)
   }