freekick2-0.1.0: src/Utils.hs
module Utils
where
import Data.Foldable
import System.Random
clamp mn mx v = min mx $ max mn v
radToDeg :: (Floating a) => a -> a
radToDeg = (/pi) . (*180)
wrap :: (Num a, Ord a) => a -> a -> a -> a
wrap mn mx v =
if v < mn
then wrap mn mx (v + diff)
else if v > mx
then wrap mn mx (v - diff)
else v
where diff = mx - mn
safeRead :: (Read a) => String -> Maybe a
safeRead s = case reads s of
[(n, _)] -> Just n
_ -> Nothing
chooseIO :: (Foldable f) => f a -> IO a
chooseIO l = do
let l' = toList l
n = length l'
i <- randomRIO (0, n - 1)
return (l' !! i)