{-# 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.Package
import Distribution.PackageDescription
import Distribution.System
import Distribution.Text
import Distribution.Types.CondTree
import Distribution.Types.ExecutableScope
import Distribution.Types.ForeignLib
import Distribution.Types.ForeignLibOption
import Distribution.Types.ForeignLibType
import Distribution.Types.IncludeRenaming
import Distribution.Types.Mixin
import Distribution.Version
import Language.Haskell.Extension

instance NFData SetupBuildInfo
instance (NFData v, NFData c, NFData a) => NFData (CondTree v c a)
instance (NFData v, NFData c, NFData a) => NFData (CondBranch v c a)
instance NFData Arch
instance NFData Benchmark
instance NFData BenchmarkInterface
instance NFData BenchmarkType
instance NFData BuildInfo
instance NFData BuildType
instance NFData LibVersionInfo
instance NFData CompilerFlavor
instance NFData ConfVar
instance NFData ExecutableScope
instance NFData IncludeRenaming
instance NFData ForeignLibType
instance NFData ForeignLibOption
instance NFData Executable
instance NFData Extension
instance NFData Flag
instance NFData Mixin
instance NFData FlagName
instance NFData GenericPackageDescription
instance NFData KnownExtension
instance NFData Language
instance NFData Library
instance NFData ForeignLib
instance NFData License
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 a => NFData (Condition a)
instance NFData Platform
instance NFData CompilerInfo
instance NFData CompilerId
instance NFData AbiTag

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)