Ticket #3731: Default.hs

File Default.hs, 4.3 KB (added by dsf, 4 years ago)

Definitions copied from Happstack.Data.Default for use with Bug2.hs

Line 
1{-# LANGUAGE OverlappingInstances, UndecidableInstances, MultiParamTypeClasses,
2             FlexibleContexts #-}
3{-# OPTIONS -Wall #-}
4
5-----------------------------------------------------------------------------
6-- |
7-- Module      :  Happstack.Data.Default
8-- Copyright   :  (c) 2009 Happstack.com; (c) 2007 HAppS LLC
9-- License     :  BSD3
10--
11-- Maintainer  :  happs@googlegroups.com
12-- Stability   :  experimental
13-- Portability :  Not portable
14--
15-- Provides default values for Haskell datatypes.
16--
17-----------------------------------------------------------------------------
18
19module Default (Default(defaultValue)) where
20
21import qualified Data.ByteString.Char8 as BSC
22import qualified Data.ByteString.Lazy.Char8 as BSLC
23import qualified Data.Text as Text
24import Data.Generics.SYB.WithClass.Basics
25import Data.Generics.SYB.WithClass.Instances ()
26import Data.Int
27import Data.Word
28import qualified Data.Map as M
29import qualified Data.Set as S
30import Foreign.ForeignPtr
31
32-- | The 'Default' class provides a 'defaultValue' value, which
33-- is the default value for that type.
34--
35-- There is no instance for arbitrary types by default, but if you
36-- declare an instance without providing the value then one will be
37-- built using the first constructor. 'defaultValue' is used to provide
38-- values for any arguments of the constructor.
39--
40-- If you want an instance for all types then import
41-- "Happstack.Data.Default.Generic".
42class (Data DefaultD a) => Default a where
43    defaultValue :: a
44    defaultValue = defaultDefaultValue
45
46-- | This is the 'defaultValue' that is used in an instance if you don't
47-- specify one. It may be a useful building block when writing your own
48-- instances.
49defaultDefaultValue :: (Data DefaultD a,Default a) => a
50defaultDefaultValue = res
51    where res = case datarep $ dataTypeOf defaultProxy res of
52                    AlgRep (c:_) ->
53                        fromConstrB defaultProxy (defaultValueD dict) c
54                    r ->
55                        error ("defaultDefaultValue: Bad DataRep: " ++ show r)
56
57-- | When writing your own generic functions for 'Default' you may
58-- need to access the class method through this datatype rather than
59-- directly.
60data DefaultD a = DefaultD { defaultValueD :: a }
61
62-- | When writing your own generic functions for 'Default' you may
63-- need this, the proxy value.
64defaultProxy :: Proxy DefaultD
65defaultProxy = error "defaultProxy"
66
67instance Default t => Sat (DefaultD t) where
68    dict = DefaultD { defaultValueD = defaultValue }
69
70instance Default a => Default [a] where
71    defaultValue = []
72
73instance Default Int     where defaultValue = 0
74instance Default Int8    where defaultValue = 0
75instance Default Int16   where defaultValue = 0
76instance Default Int32   where defaultValue = 0
77instance Default Int64   where defaultValue = 0
78instance Default Word    where defaultValue = 0
79instance Default Word8   where defaultValue = 0
80instance Default Word16  where defaultValue = 0
81instance Default Word32  where defaultValue = 0
82instance Default Word64  where defaultValue = 0
83instance Default Integer where defaultValue = 0
84instance Default Float   where defaultValue = 0
85instance Default Double  where defaultValue = 0
86
87instance (Default a, Default b) => Default (Either a b) where
88    defaultValue = Left defaultValue
89
90instance Default () where
91    defaultValue = ()
92instance (Default a, Default b) => Default (a,b) where
93    defaultValue = (defaultValue, defaultValue)
94instance (Default a, Default b, Default c) => Default (a,b,c) where
95    defaultValue = (defaultValue, defaultValue, defaultValue)
96instance (Default a, Default b, Default c, Default d) => Default (a,b,c,d) where
97    defaultValue = (defaultValue, defaultValue, defaultValue, defaultValue)
98
99
100instance Default Char where
101    defaultValue = 'A'
102
103instance Default a => Default (Maybe a) where
104    defaultValue = Nothing
105
106instance Default BSC.ByteString where
107    defaultValue = BSC.pack ""
108
109instance Default BSLC.ByteString where
110    defaultValue = BSLC.pack ""
111
112instance Default Text.Text where
113    defaultValue = Text.pack ""
114
115-- instance (Data DefaultD) T.Text
116
117-- We don't really want this instance, but we need it for the ByteString
118-- instance
119instance Default a => Default (ForeignPtr a) where
120    defaultValue = error "defaultValue: ForeignPtr"
121
122instance (Data DefaultD a, Data DefaultD b, Ord a) => Default (M.Map a b) 
123instance (Data DefaultD a, Ord a) => Default (S.Set a)