packages feed

animate-preview-0.0.0: library/Animate/Preview/Scalar.hs

module Animate.Preview.Scalar where

data Scalar
  = Scalar'None
  | Scalar'Down Int
  | Scalar'Up Int
  deriving (Show, Eq)

scalarToSeconds :: Scalar -> Float
scalarToSeconds = \case
  Scalar'None -> 1
  Scalar'Down n -> 1 - (0.1 * fromIntegral n)
  Scalar'Up n -> 1 + (0.5 * fromIntegral n)

asSpeedString :: Scalar -> String
asSpeedString = \case
  Scalar'None -> "1x"
  Scalar'Down n -> "0." ++ show (10 - n) ++ "x"
  Scalar'Up n -> show (n `div` 2 + 1) ++ "." ++ (if mod n 2 == 0 then  "0" else "5") ++ "x"

scalarToSpriteScale :: Scalar -> Float
scalarToSpriteScale = \case
  Scalar'None -> 1
  Scalar'Down n -> 1 - (0.1 * fromIntegral n)
  Scalar'Up n -> 1 + (0.1 * fromIntegral n)

asScaleString :: Scalar -> String
asScaleString = \case
  Scalar'None -> "1x"
  Scalar'Down n -> "0." ++ show (10 - n) ++ "x"
  Scalar'Up n -> show (n `div` 10 + 1) ++ "." ++ show (mod n 10) ++ "x"

incrementScalar :: Int -> Scalar -> Scalar
incrementScalar upper = \case
  Scalar'None -> Scalar'Up 1
  Scalar'Up n -> Scalar'Up (min upper (n + 1))
  Scalar'Down n -> if n <= 1 then Scalar'None else Scalar'Down (n - 1)

decrementScalar :: Int -> Scalar -> Scalar
decrementScalar lower = \case
  Scalar'None -> Scalar'Down 1
  Scalar'Down n -> Scalar'Down (min lower (n + 1))
  Scalar'Up n -> if n <= 1 then Scalar'None else Scalar'Up (n - 1)