convertible-1.0.11.1: Typeclasses and instances for converting between types

Portability | portable
Stability | provisional
Maintainer | John Goerzen <jgoerzen@complete.org>
Safe Haskell | Safe-Infered

Data.Convertible.Utils

Description

Synopsis

- 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
- mkTypeName :: String -> TypeRep
- convertVia :: (Convertible a b, Convertible b c) => b -> a -> ConvertResult c

# Documentation

boundedConversion

Arguments

:: (Ord a, Bounded b, Show a, Show b, Convertible a Integer, Convertible b Integer, Typeable a, Typeable b) |
=> (a -> ConvertResult b) | Function to do the conversion
-> a | Input data
-> ConvertResult b | Result

Utility function to perform bounds checking as part of a conversion.

Does this be examining the bounds of the destination type, converting to the type of the source via `safeConvert`, comparing to the source value. Results in an error if the conversion is out of bounds.

mkTypeName :: String -> TypeRep

Useful for defining `Typeable` instances. Example:

    instance Typeable TimeOfDay where
        typeOf _ = mkTypeName "TimeOfDay"

convertVia

Arguments

:: (Convertible a b, Convertible b c) |
=> b | Dummy data to establish intermediate type - can be undefined
-> a | Input value
-> ConvertResult c | Result

Useful for defining conversions that are implemented in terms of other conversions via an intermediary type. Instead of:

    instance Convertible CalendarTime POSIXTime where
        safeConvert a = do r <- safeConvert a
                           safeConvert (r :: ClockTime)

we can now write:

    instance Convertible CalendarTime POSIXTime where
        safeConvert = convertVia (undefined::ClockTime)

which does the same thing -- converts a CalendarTime to a ClockTime, then a ClockTime to a POSIXTime, both using existing `Convertible` instances.