-- | Animate a picture in a window.
module Graphics.Gloss.Interface.IO.Animate
        ( module Graphics.Gloss.Data.Display
        , module Graphics.Gloss.Data.Picture
        , module Graphics.Gloss.Data.Color
        , animateIO
        , animateFixedIO
        , Controller (..))
where
import Graphics.Gloss.Data.Display
import Graphics.Gloss.Data.Controller
import Graphics.Gloss.Data.Picture
import Graphics.Gloss.Data.Color
import Graphics.Gloss.Internals.Interface.Animate
import Graphics.Gloss.Internals.Interface.Backend


-- | Open a new window and display the given animation.
--
--   Once the window is open you can use the same commands as with @display@.
--
animateIO
        :: Display                -- ^ Display mode.
        -> Color                  -- ^ Background color.
        -> (Float -> IO Picture)  -- ^ Function to produce the next frame of animation.
                                  --      It is passed the time in seconds since the program started.
        -> (Controller -> IO ())  -- ^ Callback to take the display controller.
        -> IO ()

animateIO :: Display
-> Color -> (Float -> IO Picture) -> (Controller -> IO ()) -> IO ()
animateIO Display
display Color
backColor
        Float -> IO Picture
frameFunIO Controller -> IO ()
eatControllerIO
        = GLUTState
-> Bool
-> Display
-> Color
-> (Float -> IO Picture)
-> (Controller -> IO ())
-> IO ()
forall a.
Backend a =>
a
-> Bool
-> Display
-> Color
-> (Float -> IO Picture)
-> (Controller -> IO ())
-> IO ()
animateWithBackendIO
                GLUTState
defaultBackendState
                Bool
True              -- pannable
                Display
display Color
backColor
                Float -> IO Picture
frameFunIO
                Controller -> IO ()
eatControllerIO


-- | Like `animateIO` but don't allow the display to be panned around.
--
animateFixedIO
        :: Display                -- ^ Display mode.
        -> Color                  -- ^ Background color.
        -> (Float -> IO Picture)  -- ^ Function to produce the next frame of animation.
                                  --      It is passed the time in seconds since the program started.
        -> (Controller -> IO ())  -- ^ Callback to take the display controller.
        -> IO ()

animateFixedIO :: Display
-> Color -> (Float -> IO Picture) -> (Controller -> IO ()) -> IO ()
animateFixedIO Display
display Color
backColor
        Float -> IO Picture
frameFunIO Controller -> IO ()
eatControllerIO
        = GLUTState
-> Bool
-> Display
-> Color
-> (Float -> IO Picture)
-> (Controller -> IO ())
-> IO ()
forall a.
Backend a =>
a
-> Bool
-> Display
-> Color
-> (Float -> IO Picture)
-> (Controller -> IO ())
-> IO ()
animateWithBackendIO
                GLUTState
defaultBackendState
                Bool
False
                Display
display Color
backColor
                Float -> IO Picture
frameFunIO
                Controller -> IO ()
eatControllerIO