module Data.Default (
-- | This module defines a class for types with a default value. Instances are
-- provided for '()', 'S.Set', 'M.Map', 'Int', 'Integer', 'Float', 'Double',
-- 'Ratio', 'Maybe', '[]', '->' and 'IO'.
    Default(..)
) where

import Data.Ratio
import qualified Data.Set as S
import qualified Data.Map as M

-- | A class for types with a default value.
class Default a where
    -- | The default value for this type.
    def :: a

instance Default () where def = ()

instance Default (S.Set v) where def = S.empty
instance Default (M.Map k v) where def = M.empty

instance Default Int where def = 0
instance Default Integer where def = 0
instance Default Float where def = 0
instance Default Double where def = 0
instance (Integral a) => Default (Ratio a) where def = 0

instance Default (Maybe a) where def = Nothing
instance Default [a] where def = []

instance (Default r) => Default (e -> r) where def _ = def
instance (Default a) => Default (IO a) where def = return def