module Mischief.ECS.Timer where

data Timer = Timer {Timer -> Float
duration :: Float, Timer -> Float
elapsed :: Float, Timer -> Mode
mode :: Mode}

data Mode = Once | Repeat

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 :: 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)