Data.Convertible.Utils

convertible-1.1.1.0: Typeclasses and instances for converting between types

Copyright | Copyright (C) 2009-2011 John Goerzen
License | BSD3
Maintainer | John Goerzen <jgoerzen@complete.org>
Stability | provisional
Portability | portable
Safe Haskell | Safe
Language | Haskell98

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

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.