{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Distribution.Nixpkgs.Haskell.OrphanInstances ( ) where

import Control.DeepSeq
import Data.Maybe
import Data.String
import qualified Data.Text as T
import Data.Yaml
import Distribution.Compiler
import Distribution.License
import Distribution.ModuleName hiding ( main, fromString )
import Distribution.Package
import Distribution.PackageDescription
import Distribution.System
import Distribution.Text
import Distribution.Version
import Language.Haskell.Extension

#if !MIN_VERSION_Cabal(1,23,0)
import GHC.Generics ( Generic )
deriving instance Generic (CondTree v c a)
deriving instance Generic (Condition a)
deriving instance Generic ConfVar
deriving instance Generic Flag
deriving instance Generic GenericPackageDescription
#else
instance NFData SetupBuildInfo
#endif

instance (NFData v, NFData c, NFData a) => NFData (CondTree v c a)
instance NFData Arch
instance NFData Benchmark
instance NFData BenchmarkInterface
instance NFData BenchmarkType
instance NFData BuildInfo
instance NFData BuildType
instance NFData CompilerFlavor
instance NFData ConfVar
instance NFData Dependency
instance NFData Executable
instance NFData Extension
instance NFData Flag
instance NFData FlagName
instance NFData GenericPackageDescription
instance NFData KnownExtension
instance NFData Language
instance NFData Library
instance NFData License
instance NFData ModuleName
instance NFData ModuleReexport
instance NFData ModuleRenaming
instance NFData OS
instance NFData PackageDescription
instance NFData RepoKind
instance NFData RepoType
instance NFData SourceRepo
instance NFData TestSuite
instance NFData TestSuiteInterface
instance NFData TestType
instance NFData VersionRange
instance NFData a => NFData (Condition a)
instance NFData Platform
instance NFData CompilerInfo
instance NFData CompilerId
instance NFData AbiTag

instance IsString PackageName where
  fromString = text2isString "PackageName"

instance IsString Version where
  fromString = text2isString "Version"

instance IsString PackageIdentifier where
  fromString = text2isString "PackageIdentifier"

instance IsString Dependency where
  fromString = text2isString "Dependency"

instance IsString CompilerId where
  fromString = text2isString "CompilerId"

instance IsString Platform where
  fromString "i686-linux" = Platform I386 Linux
  fromString "x86_64-linux" = Platform X86_64 Linux
  fromString "x86_64-darwin" = Platform X86_64 OSX
  fromString s = error ("fromString: " ++ show s ++ " is not a valid platform")

instance FromJSON Platform where
  parseJSON (String s) = pure (fromString (T.unpack s))
  parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid platform")

instance FromJSON PackageName where
  parseJSON (String s) = return (fromString (T.unpack s))
  parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell package name")

instance FromJSON PackageIdentifier where
  parseJSON (String s) = return (fromString (T.unpack s))
  parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell package identifier")

instance FromJSON Dependency where
  parseJSON (String s) = return (fromString (T.unpack s))
  parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell Dependency")

instance FromJSON CompilerInfo where
  parseJSON (String s) = return (unknownCompilerInfo (fromString (T.unpack s)) NoAbiTag)
  parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell compiler")

-- parsing tools

text2isString :: Text a => String -> String -> a
text2isString t s = fromMaybe (error ("fromString: " ++ show s ++ " is not a valid " ++ t)) (simpleParse s)