    {-

    Copyright (c) 2013, Lukas Mai

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

        * Redistributions of source code must retain the above copyright
          notice, this list of conditions and the following disclaimer.

        * Redistributions in binary form must reproduce the above
          copyright notice, this list of conditions and the following
          disclaimer in the documentation and/or other materials provided
          with the distribution.

        * Neither the name of Lukas Mai nor the names of other
          contributors may be used to endorse or promote products derived
          from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    -}

    {-# LANGUAGE CPP #-}
    {-# LANGUAGE DefaultSignatures, TypeOperators, FlexibleContexts #-}

    {-|
    Module      : Data.Default.Internal
    Description : Implementation details.

    Nothing to see here.
    -}
    module Data.Default.Internal (Default(..), GDefault(..)) where

    import Data.Int
    import Data.Word
    import Data.Monoid
    import Data.Ratio
    import Data.Complex
    import Data.Fixed
    import Foreign.C.Types
    #if MIN_VERSION_base(4, 18, 0)
    import Foreign.C.ConstPtr
    #endif
    import Foreign.Ptr
    import Data.Proxy
    import Data.Functor.Identity
    import Control.Applicative (Const(..))
    #if MIN_VERSION_base(4, 16, 0)
    import Data.Tuple
    #endif
    import qualified Data.Set as S
    import qualified Data.Map as M
    import Data.IntMap (IntMap)
    import Data.IntSet (IntSet)
    import Data.Sequence (Seq)
    import Data.Tree (Tree(..))

    import GHC.Generics

    -- | Defaults, generically.
    class GDefault f where
        gdef :: f a

    -- | A nullary constructor is its own default.
    instance GDefault U1 where
        gdef :: forall a. U1 a
    gdef = U1 a
    forall k (p :: k). U1 p
    U1

    -- | A unary constructor wraps the default value of the argument type.
    instance (Default a) => GDefault (K1 i a) where
        gdef :: forall a. K1 i a a
    gdef = a -> K1 i a a
    forall k i c (p :: k). c -> K1 i c p
    K1 a
    forall a. Default a => a
    def

    -- | Default of products = product of defaults.
    instance (GDefault a, GDefault b) => GDefault (a :*: b) where
        gdef :: forall a. (:*:) a b a
    gdef = a a
    forall a. a a
    forall (f :: * -> *) a. GDefault f => f a
    gdef a a -> b a -> (:*:) a b a
    forall k (f :: k -> *) (g :: k -> *) (p :: k).
    f p -> g p -> (:*:) f g p
    :*: b a
    forall a. b a
    forall (f :: * -> *) a. GDefault f => f a
    gdef

    -- | For sums, we arbitrarily choose the left side.
    instance (GDefault a) => GDefault (a :+: b) where
        gdef :: forall a. (:+:) a b a
    gdef = a a -> (:+:) a b a
    forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
    L1 a a
    forall a. a a
    forall (f :: * -> *) a. GDefault f => f a
    gdef

    -- | Default of wrapper = wrapper of default.
    instance (GDefault a) => GDefault (M1 i c a) where
        gdef :: forall a. M1 i c a a
    gdef = a a -> M1 i c a a
    forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
    M1 a a
    forall a. a a
    forall (f :: * -> *) a. GDefault f => f a
    gdef

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

        default def :: (Generic a, GDefault (Rep a)) => a
        def = Rep a (ZonkAny 0) -> a
    forall a x. Generic a => Rep a x -> a
    forall x. Rep a x -> a
    to Rep a (ZonkAny 0)
    forall a. Rep a a
    forall (f :: * -> *) a. GDefault f => f a
    gdef

    instance Default Bool    where def :: Bool
    def = Bool
    False
    instance Default Int     where def :: Int
    def = Int
    0
    instance Default Int8    where def :: Int8
    def = Int8
    0
    instance Default Int16   where def :: Int16
    def = Int16
    0
    instance Default Int32   where def :: Int32
    def = Int32
    0
    instance Default Int64   where def :: Int64
    def = Int64
    0
    instance Default Word    where def :: Word
    def = Word
    0
    instance Default Word8   where def :: Word8
    def = Word8
    0
    instance Default Word16  where def :: Word16
    def = Word16
    0
    instance Default Word32  where def :: Word32
    def = Word32
    0
    instance Default Word64  where def :: Word64
    def = Word64
    0
    instance Default Integer where def :: Integer
    def = Integer
    0
    instance Default Float   where def :: Float
    def = Float
    0
    instance Default Double  where def :: Double
    def = Double
    0
    instance (Integral a) => Default (Ratio a)               where def :: Ratio a
    def = Ratio a
    0
    instance (Default a, RealFloat a) => Default (Complex a) where def :: Complex a
    def = a
    forall a. Default a => a
    def a -> a -> Complex a
    forall a. a -> a -> Complex a
    :+ a
    forall a. Default a => a
    def
    instance (HasResolution a) => Default (Fixed a)          where def :: Fixed a
    def = Fixed a
    0

    #if MIN_VERSION_base(4, 10, 0)
    instance Default CBool      where def :: CBool
    def = CBool
    0
    #endif
    instance Default CShort     where def :: CShort
    def = CShort
    0
    instance Default CUShort    where def :: CUShort
    def = CUShort
    0
    instance Default CInt       where def :: CInt
    def = CInt
    0
    instance Default CUInt      where def :: CUInt
    def = CUInt
    0
    instance Default CLong      where def :: CLong
    def = CLong
    0
    instance Default CULong     where def :: CULong
    def = CULong
    0
    instance Default CLLong     where def :: CLLong
    def = CLLong
    0
    instance Default CULLong    where def :: CULLong
    def = CULLong
    0
    instance Default CPtrdiff   where def :: CPtrdiff
    def = CPtrdiff
    0
    instance Default CSize      where def :: CSize
    def = CSize
    0
    instance Default CSigAtomic where def :: CSigAtomic
    def = CSigAtomic
    0
    instance Default CIntPtr    where def :: CIntPtr
    def = CIntPtr
    0
    instance Default CUIntPtr   where def :: CUIntPtr
    def = CUIntPtr
    0
    instance Default CIntMax    where def :: CIntMax
    def = CIntMax
    0
    instance Default CUIntMax   where def :: CUIntMax
    def = CUIntMax
    0
    instance Default CClock     where def :: CClock
    def = CClock
    0
    instance Default CTime      where def :: CTime
    def = CTime
    0
    instance Default CUSeconds  where def :: CUSeconds
    def = CUSeconds
    0
    instance Default CSUSeconds where def :: CSUSeconds
    def = CSUSeconds
    0
    instance Default CFloat     where def :: CFloat
    def = CFloat
    0
    instance Default CDouble    where def :: CDouble
    def = CDouble
    0

    instance Default (Ptr a)      where def :: Ptr a
    def = Ptr a
    forall a. Ptr a
    nullPtr
    instance Default (FunPtr a)   where def :: FunPtr a
    def = FunPtr a
    forall a. FunPtr a
    nullFunPtr
    instance Default IntPtr       where def :: IntPtr
    def = Ptr (ZonkAny 2) -> IntPtr
    forall a. Ptr a -> IntPtr
    ptrToIntPtr Ptr (ZonkAny 2)
    forall a. Default a => a
    def
    instance Default WordPtr      where def :: WordPtr
    def = Ptr (ZonkAny 1) -> WordPtr
    forall a. Ptr a -> WordPtr
    ptrToWordPtr Ptr (ZonkAny 1)
    forall a. Default a => a
    def
    #if MIN_VERSION_base(4, 18, 0)
    instance Default (ConstPtr a) where def :: ConstPtr a
    def = Ptr a -> ConstPtr a
    forall a. Ptr a -> ConstPtr a
    ConstPtr Ptr a
    forall a. Default a => a
    def
    #endif

    instance Default (Maybe a) where def :: Maybe a
    def = Maybe a
    forall a. Maybe a
    Nothing
    instance (Default a) => Default (Identity a) where def :: Identity a
    def = a -> Identity a
    forall a. a -> Identity a
    Identity a
    forall a. Default a => a
    def
    instance (Default a) => Default (Const a b)  where def :: Const a b
    def = a -> Const a b
    forall {k} a (b :: k). a -> Const a b
    Const a
    forall a. Default a => a
    def

    instance Default ()                     where def :: ()
    def = ()
    forall a. Monoid a => a
    mempty
    instance Default [a]                    where def :: [a]
    def = [a]
    forall a. Monoid a => a
    mempty
    instance Default Ordering               where def :: Ordering
    def = Ordering
    forall a. Monoid a => a
    mempty
    instance Default Any                    where def :: Any
    def = Any
    forall a. Monoid a => a
    mempty
    instance Default All                    where def :: All
    def = All
    forall a. Monoid a => a
    mempty
    instance Default (Last a)               where def :: Last a
    def = Last a
    forall a. Monoid a => a
    mempty
    instance Default (First a)              where def :: First a
    def = First a
    forall a. Monoid a => a
    mempty
    instance (Num a) => Default (Sum a)     where def :: Sum a
    def = Sum a
    forall a. Monoid a => a
    mempty
    instance (Num a) => Default (Product a) where def :: Product a
    def = Product a
    forall a. Monoid a => a
    mempty
    instance Default (Endo a)               where def :: Endo a
    def = Endo a
    forall a. Monoid a => a
    mempty
    instance Default (Proxy a)              where def :: Proxy a
    def = Proxy a
    forall a. Monoid a => a
    mempty
    #if MIN_VERSION_base(4, 16, 0)
    instance (Default a) => Default (Solo a) where def :: Solo a
    def = a -> Solo a
    forall a. a -> Solo a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure a
    forall a. Default a => a
    def
    #endif
    instance (Default a) => Default (Dual a) where def :: Dual a
    def = a -> Dual a
    forall a. a -> Dual a
    Dual a
    forall a. Default a => a
    def

    instance Default (S.Set v)               where def :: Set v
    def = Set v
    forall v. Set v
    S.empty
    instance Default (M.Map k v)             where def :: Map k v
    def = Map k v
    forall k v. Map k v
    M.empty
    instance Default (IntMap v)              where def :: IntMap v
    def = IntMap v
    forall a. Monoid a => a
    mempty
    instance Default IntSet                  where def :: IntSet
    def = IntSet
    forall a. Monoid a => a
    mempty
    instance Default (Seq a)                 where def :: Seq a
    def = Seq a
    forall a. Monoid a => a
    mempty
    instance (Default a) => Default (Tree a) where def :: Tree a
    def = a -> [Tree a] -> Tree a
    forall a. a -> [Tree a] -> Tree a
    Node a
    forall a. Default a => a
    def []

    instance (Default a1, Default a2) => Default (a1, a2) where
        def :: (a1, a2)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3) => Default (a1, a2, a3) where
        def :: (a1, a2, a3)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4) => Default (a1, a2, a3, a4) where
        def :: (a1, a2, a3, a4)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5) => Default (a1, a2, a3, a4, a5) where
        def :: (a1, a2, a3, a4, a5)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6) => Default (a1, a2, a3, a4, a5, a6) where
        def :: (a1, a2, a3, a4, a5, a6)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7) => Default (a1, a2, a3, a4, a5, a6, a7) where
        def :: (a1, a2, a3, a4, a5, a6, a7)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8) => Default (a1, a2, a3, a4, a5, a6, a7, a8) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24, Default a25) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24, a25)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def, a25
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24, Default a25, Default a26) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def, a25
    forall a. Default a => a
    def, a26
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24, Default a25, Default a26, Default a27) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def, a25
    forall a. Default a => a
    def, a26
    forall a. Default a => a
    def, a27
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24, Default a25, Default a26, Default a27, Default a28) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def, a25
    forall a. Default a => a
    def, a26
    forall a. Default a => a
    def, a27
    forall a. Default a => a
    def, a28
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24, Default a25, Default a26, Default a27, Default a28, Default a29) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28,
     a29)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def, a25
    forall a. Default a => a
    def, a26
    forall a. Default a => a
    def, a27
    forall a. Default a => a
    def, a28
    forall a. Default a => a
    def, a29
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24, Default a25, Default a26, Default a27, Default a28, Default a29, Default a30) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28,
     a29, a30)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def, a25
    forall a. Default a => a
    def, a26
    forall a. Default a => a
    def, a27
    forall a. Default a => a
    def, a28
    forall a. Default a => a
    def, a29
    forall a. Default a => a
    def, a30
    forall a. Default a => a
    def)

    instance (Default a1, Default a2, Default a3, Default a4, Default a5, Default a6, Default a7, Default a8, Default a9, Default a10, Default a11, Default a12, Default a13, Default a14, Default a15, Default a16, Default a17, Default a18, Default a19, Default a20, Default a21, Default a22, Default a23, Default a24, Default a25, Default a26, Default a27, Default a28, Default a29, Default a30, Default a31) => Default (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31) where
        def :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
     a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28,
     a29, a30, a31)
    def = (a1
    forall a. Default a => a
    def, a2
    forall a. Default a => a
    def, a3
    forall a. Default a => a
    def, a4
    forall a. Default a => a
    def, a5
    forall a. Default a => a
    def, a6
    forall a. Default a => a
    def, a7
    forall a. Default a => a
    def, a8
    forall a. Default a => a
    def, a9
    forall a. Default a => a
    def, a10
    forall a. Default a => a
    def, a11
    forall a. Default a => a
    def, a12
    forall a. Default a => a
    def, a13
    forall a. Default a => a
    def, a14
    forall a. Default a => a
    def, a15
    forall a. Default a => a
    def, a16
    forall a. Default a => a
    def, a17
    forall a. Default a => a
    def, a18
    forall a. Default a => a
    def, a19
    forall a. Default a => a
    def, a20
    forall a. Default a => a
    def, a21
    forall a. Default a => a
    def, a22
    forall a. Default a => a
    def, a23
    forall a. Default a => a
    def, a24
    forall a. Default a => a
    def, a25
    forall a. Default a => a
    def, a26
    forall a. Default a => a
    def, a27
    forall a. Default a => a
    def, a28
    forall a. Default a => a
    def, a29
    forall a. Default a => a
    def, a30
    forall a. Default a => a
    def, a31
    forall a. Default a => a
    def)