{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Macro.DeepSeq where

import Macro.Types

import Control.DeepSeq
#if MIN_VERSION_deepseq(1,4,3)
     hiding (rnf1, rnf2)
#endif

rnf0 :: ()
rnf1 :: NFData a => a -> ()
rnf2 :: (NFData a, NFData a1) => a -> a1 -> ()
rnf3 :: (NFData a, NFData a1, NFData a2) =>
        a -> a1 -> a2 -> ()
rnf4 :: (NFData a, NFData a1, NFData a2, NFData a3) =>
        a -> a1 -> a2 -> a3 -> ()
rnf5 :: (NFData a, NFData a1, NFData a2, NFData a3, NFData a4) =>
        a -> a1 -> a2 -> a3 -> a4 -> ()
rnf6 :: (NFData a, NFData a1, NFData a2, NFData a3, NFData a4,
         NFData a5) =>
        a -> a1 -> a2 -> a3 -> a4 -> a5 -> ()
rnf7 :: (NFData a, NFData a1, NFData a2, NFData a3, NFData a4, NFData a5,
         NFData a6) =>
        a -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> ()


rnf0           = ()
rnf1 a         = rnf a `seq` ()
rnf2 a b       = rnf a `seq` rnf b `seq` ()
rnf3 a b c     = rnf a `seq` rnf b `seq` rnf c `seq` ()
rnf4 a b c d   = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` ()
rnf5 a b c d e = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` ()
rnf6 a b c d e
     f         = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq`
                 rnf f `seq` ()
rnf7 a b c d e
     f g       = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq`
                 rnf f `seq` rnf g `seq` ()
{-# INLINE rnf0 #-}
{-# INLINE rnf1 #-}
{-# INLINE rnf2 #-}
{-# INLINE rnf3 #-}
{-# INLINE rnf4 #-}
{-# INLINE rnf5 #-}
{-# INLINE rnf6 #-}
{-# INLINE rnf7 #-}

instance NFData PackageName where
  rnf (PackageName a) = rnf1 a

instance NFData PackageId where
  rnf (PackageId a b) = rnf2 a b

instance NFData Version where
  rnf (Version a b) = rnf2 a b

instance NFData VersionRange where
  rnf AnyVersion                   = rnf0
  rnf (ThisVersion            a)   = rnf1 a
  rnf (LaterVersion           a)   = rnf1 a
  rnf (EarlierVersion         a)   = rnf1 a
  rnf (WildcardVersion        a)   = rnf1 a
  rnf (UnionVersionRanges     a b) = rnf2 a b
  rnf (IntersectVersionRanges a b) = rnf2 a b
  rnf (VersionRangeParens     a)   = rnf1 a

instance NFData Dependency where
  rnf (Dependency a b) = rnf2 a b

instance NFData CompilerFlavor where
  rnf GHC    = rnf0
  rnf NHC    = rnf0
  rnf YHC    = rnf0
  rnf Hugs   = rnf0
  rnf HBC    = rnf0
  rnf Helium = rnf0
  rnf JHC    = rnf0
  rnf LHC    = rnf0
  rnf UHC    = rnf0
  rnf (HaskellSuite a)  = rnf1 a
  rnf (OtherCompiler a) = rnf1 a

instance NFData License where
  rnf (GPL a)    = rnf1 a
  rnf (AGPL a)   = rnf1 a
  rnf (LGPL a)   = rnf1 a
  rnf BSD3       = rnf0
  rnf BSD4       = rnf0
  rnf MIT        = rnf0
  rnf (Apache a) = rnf1 a
  rnf PublicDomain       = rnf0
  rnf AllRightsReserved  = rnf0
  rnf OtherLicense       = rnf0
  rnf (UnknownLicense a) = rnf1 a

instance NFData SourceRepo where
  rnf (SourceRepo a b c d e f g) = rnf7 a b c d e f g

instance NFData RepoKind where
  rnf RepoHead  = rnf0
  rnf RepoThis  = rnf0
  rnf (RepoKindUnknown a) = rnf1 a


instance NFData RepoType where
  rnf Darcs     = rnf0
  rnf Git       = rnf0
  rnf SVN       = rnf0
  rnf CVS       = rnf0
  rnf Mercurial = rnf0
  rnf GnuArch   = rnf0
  rnf Bazaar    = rnf0
  rnf Monotone  = rnf0
  rnf (OtherRepoType a) = rnf1 a

instance NFData BuildType where
  rnf Simple    = rnf0
  rnf Configure = rnf0
  rnf Make      = rnf0
  rnf Custom    = rnf0
  rnf (UnknownBuildType a) = rnf1 a

instance NFData Library where
  rnf (Library a b c) = rnf3 a b c

instance NFData Executable where
  rnf (Executable a b c) = rnf3 a b c

instance NFData TestSuite where
  rnf (TestSuite a b c d) = rnf4 a b c d

instance NFData TestSuiteInterface where
  rnf (TestSuiteExeV10 a b)    = rnf2 a b
  rnf (TestSuiteLibV09 a b)    = rnf2 a b
  rnf (TestSuiteUnsupported a) = rnf1 a

instance NFData TestType where
  rnf (TestTypeExe a) = rnf1 a
  rnf (TestTypeLib a) = rnf1 a
  rnf (TestTypeUnknown a b) = rnf2 a b

instance NFData Benchmark where
  rnf (Benchmark a b c d) = rnf4 a b c d

instance NFData BenchmarkInterface where
  rnf (BenchmarkExeV10 a b)    = rnf2 a b
  rnf (BenchmarkUnsupported a) = rnf1 a

instance NFData BenchmarkType where
  rnf (BenchmarkTypeExe     a)   = rnf1 a
  rnf (BenchmarkTypeUnknown a b) = rnf2 a b

instance NFData ModuleName where
  rnf (ModuleName a) = rnf1 a

instance NFData BuildInfo where
  rnf (BuildInfo 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) =
    rnf a1  `seq` rnf a2  `seq` rnf a3  `seq` rnf a4  `seq` rnf a5  `seq`
    rnf a6  `seq` rnf a7  `seq` rnf a8  `seq` rnf a9  `seq` rnf a10 `seq`
    rnf a11 `seq` rnf a12 `seq` rnf a13 `seq` rnf a14 `seq` rnf a15 `seq`
    rnf a16 `seq` rnf a17 `seq` rnf a18 `seq` rnf a19 `seq` rnf a20 `seq`
    rnf a21 `seq` rnf a22 `seq` rnf a23 `seq` rnf a24 `seq` rnf a25 `seq` ()


instance NFData Language where
  rnf Haskell98   = rnf0
  rnf Haskell2010 = rnf0
  rnf (UnknownLanguage a) = rnf1 a

instance NFData Extension where
  rnf (EnableExtension  a) = rnf1 a
  rnf (DisableExtension a) = rnf1 a
  rnf (UnknownExtension a) = rnf1 a

instance NFData KnownExtension

instance NFData PackageDescription where
  rnf (PackageDescription 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) =
    rnf a1  `seq` rnf a2  `seq` rnf a3  `seq` rnf a4  `seq` rnf a5  `seq`
    rnf a6  `seq` rnf a7  `seq` rnf a8  `seq` rnf a9  `seq` rnf a10 `seq`
    rnf a11 `seq` rnf a12 `seq` rnf a13 `seq` rnf a14 `seq` rnf a15 `seq`
    rnf a16 `seq` rnf a17 `seq` rnf a18 `seq` rnf a19 `seq` rnf a20 `seq`
    rnf a21 `seq` rnf a22 `seq` rnf a23 `seq` rnf a24 `seq` rnf a25 `seq`
    rnf a26 `seq` rnf a27 `seq` rnf a28 `seq` ()

instance NFData OS where
  rnf Linux   = rnf0
  rnf Windows = rnf0
  rnf OSX     = rnf0
  rnf FreeBSD = rnf0
  rnf OpenBSD = rnf0
  rnf NetBSD  = rnf0
  rnf Solaris = rnf0
  rnf AIX     = rnf0
  rnf HPUX    = rnf0
  rnf IRIX    = rnf0
  rnf HaLVM   = rnf0
  rnf IOS     = rnf0
  rnf (OtherOS a) = rnf1 a

instance NFData Arch where
  rnf I386   = rnf0
  rnf X86_64 = rnf0
  rnf PPC    = rnf0
  rnf PPC64  = rnf0
  rnf Sparc  = rnf0
  rnf Arm    = rnf0
  rnf Mips   = rnf0
  rnf SH     = rnf0
  rnf IA64   = rnf0
  rnf S390   = rnf0
  rnf Alpha  = rnf0
  rnf Hppa   = rnf0
  rnf Rs6000 = rnf0
  rnf M68k   = rnf0
  rnf (OtherArch a) = rnf1 a
  rnf Vax    = rnf0

instance NFData Flag where
  rnf (MkFlag a b c d) = rnf4 a b c d

instance NFData FlagName where
  rnf (FlagName a) = rnf1 a

instance (NFData a, NFData b, NFData c) => NFData (CondTree a b c) where
  rnf (CondNode a b c) = rnf3 a b c

instance NFData ConfVar where
  rnf (OS   a)   = rnf1 a
  rnf (Arch a)   = rnf1 a
  rnf (Flag a)   = rnf1 a
  rnf (Impl a b) = rnf2 a b

instance NFData a => NFData (Condition a) where
  rnf (Var  a)   = rnf1 a
  rnf (Lit  a)   = rnf1 a
  rnf (CNot a)   = rnf1 a
  rnf (COr  a b) = rnf2 a b
  rnf (CAnd a b) = rnf2 a b

instance NFData GenericPackageDescription where
  rnf (GenericPackageDescription a b c d e f) = rnf6 a b c d e f