# LANGUAGE CPP , ForeignFunctionInterface #
module SFML.System.Clock
(
    Clock(..)
,   createClock
,   copy
,   destroy
,   getElapsedTime
,   restartClock
)
where


import SFML.SFCopyable
import SFML.SFResource
import SFML.System.Time

import Foreign.Marshal.Alloc (alloca)
import Foreign.Ptr
import Foreign.Storable (peek)


newtype Clock = Clock (Ptr Clock)


-- | Create a new clock and start it.
createClock :: IO Clock
createClock = sfClock_create

foreign import ccall unsafe "sfClock_create"
    sfClock_create :: IO Clock

CSFML_SYSTEM_API sfClock * sfClock_create(void ) ;


instance SFCopyable Clock where
    
# INLINABLE copy #
    copy = sfClock_copy


foreign import ccall unsafe "sfClock_copy"
    sfClock_copy :: Clock -> IO Clock

CSFML_SYSTEM_API sfClock * sfClock_copy(sfClock * clock ) ;


instance SFResource Clock where
    
# INLINABLE destroy #
    destroy = sfClock_destroy

foreign import ccall unsafe "sfClock_destroy"
    sfClock_destroy :: Clock -> IO ()

CSFML_SYSTEM_API void sfClock_destroy(sfClock * clock ) ;


-- | Get the time elapsed in a clock.
--
-- This function returns the time elapsed since the last call
-- to sfClock_restart (or the construction of the object if
-- sfClock_restart has not been called).

getElapsedTime :: Clock -> IO Time
getElapsedTime clock = alloca $ \ptr -> sfClock_getElapsedTime_helper clock ptr >> peek ptr

foreign import ccall unsafe "sfClock_getElapsedTime_helper"
    sfClock_getElapsedTime_helper :: Clock -> Ptr Time -> IO ()

CSFML_SYSTEM_API sfTime sfClock_getElapsedTime(const sfClock * clock ) ;


-- | Restart a clock.
--
  This function puts the time counter back to zero .
-- It also returns the time elapsed since the clock was started.

restartClock :: Clock -> IO Time
restartClock clock = alloca $ \ptr -> sfClock_restart_helper clock ptr >> peek ptr

foreign import ccall unsafe "sfClock_restart_helper"
    sfClock_restart_helper :: Clock -> Ptr Time -> IO ()

CSFML_SYSTEM_API sfTime sfClock_restart(sfClock * clock ) ;


 | Create a new clock and start it.
 | Get the time elapsed in a clock.

 This function returns the time elapsed since the last call
 to sfClock_restart (or the construction of the object if
 sfClock_restart has not been called).
 | Restart a clock.

 It also returns the time elapsed since the clock was started.
# LANGUAGE CPP , ForeignFunctionInterface #
module SFML.System.Clock
(
    Clock(..)
,   createClock
,   copy
,   destroy
,   getElapsedTime
,   restartClock
)
where


import SFML.SFCopyable
import SFML.SFResource
import SFML.System.Time

import Foreign.Marshal.Alloc (alloca)
import Foreign.Ptr
import Foreign.Storable (peek)


newtype Clock = Clock (Ptr Clock)


createClock :: IO Clock
createClock = sfClock_create

foreign import ccall unsafe "sfClock_create"
    sfClock_create :: IO Clock

CSFML_SYSTEM_API sfClock * sfClock_create(void ) ;


instance SFCopyable Clock where
    
# INLINABLE copy #
    copy = sfClock_copy


foreign import ccall unsafe "sfClock_copy"
    sfClock_copy :: Clock -> IO Clock

CSFML_SYSTEM_API sfClock * sfClock_copy(sfClock * clock ) ;


instance SFResource Clock where
    
# INLINABLE destroy #
    destroy = sfClock_destroy

foreign import ccall unsafe "sfClock_destroy"
    sfClock_destroy :: Clock -> IO ()

CSFML_SYSTEM_API void sfClock_destroy(sfClock * clock ) ;



getElapsedTime :: Clock -> IO Time
getElapsedTime clock = alloca $ \ptr -> sfClock_getElapsedTime_helper clock ptr >> peek ptr

foreign import ccall unsafe "sfClock_getElapsedTime_helper"
    sfClock_getElapsedTime_helper :: Clock -> Ptr Time -> IO ()

CSFML_SYSTEM_API sfTime sfClock_getElapsedTime(const sfClock * clock ) ;


  This function puts the time counter back to zero .

restartClock :: Clock -> IO Time
restartClock clock = alloca $ \ptr -> sfClock_restart_helper clock ptr >> peek ptr

foreign import ccall unsafe "sfClock_restart_helper"
    sfClock_restart_helper :: Clock -> Ptr Time -> IO ()

CSFML_SYSTEM_API sfTime sfClock_restart(sfClock * clock ) ;

