packages feed

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)