packages feed

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