module Mischief.ECS.Timer where

-- | A type that can be used to keep track of time.
data Timer = Timer {Timer -> Float
duration :: Float, Timer -> Float
elapsed :: Float, Timer -> Mode
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 :: Float -> Mode -> Timer
new Float
duration Mode
mode = Timer {Float
duration :: Float
duration :: Float
duration, Mode
mode :: Mode
mode :: Mode
mode, elapsed :: Float
elapsed = Float
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 :: Float -> Timer -> (Timer, Bool)
tick Float
_ Timer
timer | Timer
timer.elapsed Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
>= Timer
timer.duration = (Timer
timer, Bool
False)
tick Float
x Timer
timer | Timer
timer.elapsed Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
x Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
< Timer
timer.duration = (Timer
timer {elapsed = timer.elapsed + x}, Bool
False)
tick Float
_ Timer {Float
duration :: Timer -> Float
duration :: Float
duration, elapsed :: Timer -> Float
elapsed = Float
_, mode :: Timer -> Mode
mode = Mode
Once} = (Timer {Float
duration :: Float
duration :: Float
duration, elapsed :: Float
elapsed = Float
duration, mode :: Mode
mode = Mode
Once}, Bool
True)
tick Float
x Timer {Float
duration :: Timer -> Float
duration :: Float
duration, Float
elapsed :: Timer -> Float
elapsed :: Float
elapsed, mode :: Timer -> Mode
mode = Mode
Repeat} = (Timer {Float
duration :: Float
duration :: Float
duration, elapsed :: Float
elapsed = Float
elapsed Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
duration, mode :: Mode
mode = Mode
Repeat}, Bool
True)