{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} module Propellor.Types.ConfigurableValue where import Data.Word -- | A value that can be used in a configuration file, or otherwise used to -- configure a program. -- -- Unlike Show, there should only be instances of this type class for -- values that have a standard serialization that is understood outside of -- Haskell code. -- -- When converting a type alias such as "type Foo = String" or "type Foo = Int" -- to a newtype, it's unsafe to derive a Show instance, because there may -- be code that shows the type to configure a value. Instead, define a -- ConfigurableValue instance. class ConfigurableValue t where val :: t -> String -- | val String does not do any quoting, unlike show String instance ConfigurableValue String where val = id instance ConfigurableValue Int where val = show instance ConfigurableValue Integer where val = show instance ConfigurableValue Float where val = show instance ConfigurableValue Double where val = show instance ConfigurableValue Word8 where val = show instance ConfigurableValue Word16 where val = show instance ConfigurableValue Word32 where val = show