module Data.Convertible.Utils(boundedConversion,
mkTypeName
)
where
import Data.Convertible.Base
import Data.Typeable
boundedConversion :: (Ord a, Bounded b, Show a, Show b, Convertible a Integer,
Convertible b Integer,
Typeable a, Typeable b) =>
(a -> ConvertResult b)
-> a
-> ConvertResult b
boundedConversion func inp =
do result <- func inp
let smallest = asTypeOf minBound result
let biggest = asTypeOf maxBound result
let smallest' = (convert smallest)::Integer
let biggest' = (convert biggest)::Integer
let inp' = (convert inp)::Integer
if inp' < smallest' || inp' > biggest'
then convError ("Input value outside of bounds: " ++ show (smallest, biggest))
inp
else return result
mkTypeName :: String -> TypeRep
mkTypeName name = mkTyConApp (mkTyCon name) []