roc-id-0.2.0.0: library/ROC/ID/Utilities.hs
{-# LANGUAGE ScopedTypeVariables #-}
module ROC.ID.Utilities where
import Control.Monad.Random.Class
( MonadRandom (..) )
import Data.Maybe
( listToMaybe )
guard :: x -> Maybe y -> Either x y
guard x = maybe (Left x) Right
maybeRead :: Read a => String -> Maybe a
maybeRead = fmap fst . listToMaybe . reads
maybeToEnum :: forall a . Bounded a => Enum a => Int -> Maybe a
maybeToEnum i
| i < fromEnum (minBound :: a) = Nothing
| i > fromEnum (maxBound :: a) = Nothing
| otherwise = pure $ toEnum i
randomBoundedEnum :: forall a m . MonadRandom m => Bounded a => Enum a => m a
randomBoundedEnum =
toEnum <$> getRandomR (fromEnum (minBound :: a), fromEnum (maxBound :: a))