{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DeriveDataTypeable #-}

module Instances where

import GHC hiding(TyCon)
import SrcLoc
import RdrName
import OccName
import FastString
import Bag
import Module
import BasicTypes
import Var
import ForeignCall

import Data.Generics
import NameSet
import TypeRep
import qualified TyCon

import Instances0

#include "Typeable.h"

-- Typeable0

deriving instance Typeable Prag
deriving instance Data Prag

deriving instance Typeable HsWrapper
deriving instance Data HsWrapper

deriving instance Typeable PredType
deriving instance Data PredType

deriving instance Typeable Type
deriving instance Data Type

deriving instance Typeable HsLit
deriving instance Data HsLit

-- Typeable1

deriving instance Typeable1 Located
deriving instance Data e => Data (Located e)

deriving instance Typeable1 HsModule
deriving instance Data a => Data (HsModule a)

deriving instance Typeable1 HsDoc
deriving instance Data a => Data (HsDoc a)

deriving instance Typeable1 HaddockModInfo
deriving instance Data a => Data (HaddockModInfo a)

deriving instance Typeable1 HsDecl
deriving instance Data a => Data (HsDecl a)

deriving instance Typeable1 ImportDecl
deriving instance Data a => Data (ImportDecl a)

deriving instance Typeable1 IE
deriving instance Data a => Data (IE a)

deriving instance Typeable1 TyClDecl
deriving instance Data a => Data (TyClDecl a)

deriving instance Typeable1 DocDecl
deriving instance Data a => Data (DocDecl a)

deriving instance Typeable1 SpliceDecl
deriving instance Data a => Data (SpliceDecl a)

deriving instance Typeable1 RuleDecl
deriving instance Data a => Data (RuleDecl a)

deriving instance Typeable1 DeprecDecl
deriving instance Data a => Data (DeprecDecl a)

deriving instance Typeable1 ForeignDecl
deriving instance Data a => Data (ForeignDecl a)

deriving instance Typeable1 DefaultDecl
deriving instance Data a => Data (DefaultDecl a)

deriving instance Typeable1 Sig
deriving instance Data a => Data (Sig a)

deriving instance Typeable1 DerivDecl
deriving instance Data a => Data (DerivDecl a)

deriving instance Typeable1 InstDecl
deriving instance Data a => Data (InstDecl a)

deriving instance Typeable1 HsPred
deriving instance Data a => Data (HsPred a)

deriving instance Typeable1 HsType
deriving instance Data a => Data (HsType a)

deriving instance Typeable1 ConDecl
deriving instance Data a => Data (ConDecl a)

INSTANCE_TYPEABLE1(Bag,bagTc,"Bag")
instance Data a => Data (Bag a) where
  gfoldl k z b = z listToBag `k` bagToList b -- traverse abstract type abstractly
  toConstr _   = abstractConstr $ "Bag("++show (typeOf (undefined::a))++")"
  gunfold _ _  = error "gunfold"
  dataTypeOf _ = mkNorepType "Bag"

deriving instance Typeable1 HsTyVarBndr
deriving instance Data a => Data (HsTyVarBndr a)

deriving instance Typeable1 ResType
deriving instance Data a => Data (ResType a)

deriving instance Typeable1 HsSplice
deriving instance Data a => Data (HsSplice a)

deriving instance Typeable1 ConDeclField
deriving instance Data a => Data (ConDeclField a)

deriving instance Typeable1 IPName
deriving instance Data a => Data (IPName a)

deriving instance Typeable1 MatchGroup
deriving instance Data a => Data (MatchGroup a)

deriving instance Typeable1 Pat
deriving instance Data a => Data (Pat a)

deriving instance Typeable1 GRHSs
deriving instance Data a => Data (GRHSs a)

deriving instance Typeable1 HsExpr
deriving instance Data a => Data (HsExpr a)

deriving instance Typeable1 HsQuasiQuote
deriving instance Data a => Data (HsQuasiQuote a)

deriving instance Typeable1 HsOverLit
deriving instance Data a => Data (HsOverLit a)

deriving instance Typeable1 ArithSeqInfo
deriving instance Data a => Data (ArithSeqInfo a)

deriving instance Typeable1 HsBracket
deriving instance Data a => Data (HsBracket a)

deriving instance Typeable1 HsCmdTop
deriving instance Data a => Data (HsCmdTop a)

deriving instance Typeable1 HsGroup
deriving instance Data a => Data (HsGroup a)

deriving instance Typeable1 FixitySig
deriving instance Data a => Data (FixitySig a)

deriving instance Typeable1 HsIPBinds
deriving instance Data a => Data (HsIPBinds a)

deriving instance Typeable1 IPBind
deriving instance Data a => Data (IPBind a)

deriving instance Typeable1 GroupByClause
deriving instance Data a => Data (GroupByClause a)

deriving instance Typeable1 HsStmtContext
deriving instance Data a => Data (HsStmtContext a)

deriving instance Typeable1 HsMatchContext
deriving instance Data a => Data (HsMatchContext a)

deriving instance Typeable1 GRHS
deriving instance Data a => Data (GRHS a)

deriving instance Typeable1 Match
deriving instance Data a => Data (Match a)

deriving instance Typeable1 RuleBndr
deriving instance Data a => Data (RuleBndr a)

-- Typeable2

deriving instance Typeable2 HsBindLR
deriving instance (Data a,Data b) => Data (HsBindLR a b)

deriving instance Typeable2 StmtLR
deriving instance (Data a,Data b) => Data (StmtLR a b)

deriving instance Typeable2 HsLocalBindsLR
deriving instance (Data a,Data b) => Data (HsLocalBindsLR a b)

deriving instance Typeable2 HsValBindsLR
deriving instance (Data a,Data b) => Data (HsValBindsLR a b)

deriving instance Typeable2 HsConDetails
deriving instance (Data a,Data b) => Data (HsConDetails a b)

deriving instance Typeable2 HsRecFields
deriving instance (Data a,Data b) => Data (HsRecFields a b)

deriving instance Typeable2 HsRecField
deriving instance (Data a,Data b) => Data (HsRecField a b)



