Portability | portable |
---|---|

Stability | provisional |

Maintainer | Michael Snoyman <michael@snoyman.com> |

- boundedConversion :: (Ord a, Bounded b, Show a, Show b, ConvertAttempt a Integer, ConvertAttempt b Integer, Typeable a, Typeable b) => (a -> Attempt b) -> a -> Attempt b
- data ConvertBoundsException v a = ConvertBoundsException v v a
- mkTypeName :: String -> TypeRep
- convertAttemptVia :: (ConvertAttempt a b, ConvertAttempt b c) => b -> a -> Attempt c
- convertSuccessVia :: (ConvertSuccess a b, ConvertSuccess b c) => b -> a -> c

# Documentation

:: (Ord a, Bounded b, Show a, Show b, ConvertAttempt a Integer, ConvertAttempt b Integer, Typeable a, Typeable b) | |

=> (a -> Attempt b) | Function to do the conversion |

-> a | Input data |

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

data ConvertBoundsException v a Source

ConvertBoundsException v v a |

Typeable2 ConvertBoundsException | |

(Show v, Show a) => Show (ConvertBoundsException v a) | |

(Show v, Show a, Typeable v, Typeable a) => Exception (ConvertBoundsException v a) |

mkTypeName :: String -> TypeRepSource

Useful for defining `Typeable`

instances. Example:

instance Typeable TimeOfDay where typeOf _ = mkTypeName "TimeOfDay"

:: (ConvertAttempt a b, ConvertAttempt b c) | |

=> b | Dummy data to establish intermediate type - can be undefined |

-> a | Input value |

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

:: (ConvertSuccess a b, ConvertSuccess b c) | |

=> b | Dummy data to establish intermediate type - can be undefined |

-> a | Input value |

-> c | Result |

Same as `convertAttemptVia`

for `ConvertSuccess`