packages feed

mischief-ecs-0.2.0.0: src/Mischief/ECS/Timer.hs

module Mischief.ECS.Timer where

-- | A type that can be used to keep track of time.
data Timer = Timer {duration :: Float, elapsed :: Float, mode :: Mode}

-- | A mode for the 'Timer'. Being set to Repeat will mean the timer loops around once it finishes, while being set to Once will make it stop completely after one finish.
data Mode = Once | Repeat

-- | Create a new Timer specifying its duration in seconds and its mode.
new :: Float -> Mode -> Timer
new duration mode = Timer {duration, mode, elapsed = 0}

-- | Tick a timer by a certain duration. Will return the new state of the timer, as well as a bool signaling whether it has just finished or not.
tick :: Float -> Timer -> (Timer, Bool)
tick _ timer | timer.elapsed >= timer.duration = (timer, False)
tick x timer | timer.elapsed + x < timer.duration = (timer {elapsed = timer.elapsed + x}, False)
tick _ Timer {duration, elapsed = _, mode = Once} = (Timer {duration, elapsed = duration, mode = Once}, True)
tick x Timer {duration, elapsed, mode = Repeat} = (Timer {duration, elapsed = elapsed + x - duration, mode = Repeat}, True)