module Data.Convertible.Utils(boundedConversion,
convertVia
)
where
import Data.Convertible.Base
import Data.Typeable
boundedConversion :: (Bounded b, Show a, Show b, Convertible a Integer,
Convertible b Integer,
Typeable a, Typeable b) =>
(a -> ConvertResult b)
-> a
-> ConvertResult b
boundedConversion :: forall b a.
(Bounded b, Show a, Show b, Convertible a Integer,
Convertible b Integer, Typeable a, Typeable b) =>
(a -> ConvertResult b) -> a -> ConvertResult b
boundedConversion a -> ConvertResult b
func a
inp =
do result <- a -> ConvertResult b
func a
inp
let smallest = b -> b -> b
forall a. a -> a -> a
asTypeOf b
forall a. Bounded a => a
minBound b
result
let biggest = b -> b -> b
forall a. a -> a -> a
asTypeOf b
forall a. Bounded a => a
maxBound b
result
let smallest' = b -> Integer
forall a b. Convertible a b => a -> b
convert b
smallest :: Integer
let biggest' = b -> Integer
forall a b. Convertible a b => a -> b
convert b
biggest :: Integer
let inp' = a -> Integer
forall a b. Convertible a b => a -> b
convert a
inp :: Integer
if inp' < smallest' || inp' > biggest'
then convError ("Input value outside of bounds: " ++ show (smallest, biggest))
inp
else return result
convertVia :: (Convertible a b, Convertible b c) =>
b
-> a
-> ConvertResult c
convertVia :: forall a b c.
(Convertible a b, Convertible b c) =>
b -> a -> ConvertResult c
convertVia b
dummy a
inp =
do r1 <- a -> ConvertResult b
forall a b. Convertible a b => a -> ConvertResult b
safeConvert a
inp
safeConvert (asTypeOf r1 dummy)