-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Access Hackage's package database via Data.Map
--   
--   This is an early and mostly undocumented release of the 2.x version of
--   hackage-db that's intended mostly for experimenting with and testing
--   of the new API. Porting code from 1.x to 2.x is pretty simple, but if
--   you do that at this point, please expect minor details of this API to
--   change in forthcoming releases. For production code, you are probably
--   better off with the 1.x release for now.
--   
--   Check out
--   <a>https://github.com/peti/hackage-db/tree/master/example/</a> for a
--   collection of simple example programs that demonstrate how to use this
--   code.
@package hackage-db
@version 2.0


module Distribution.Hackage.DB.Errors
data HackageDBTarball a
HackageDBTarball :: FilePath -> a -> HackageDBTarball a
data HackageDBPackageName a
HackageDBPackageName :: PackageName -> a -> HackageDBPackageName a
data HackageDBPackageVersion a
HackageDBPackageVersion :: Version -> a -> HackageDBPackageVersion a
newtype IncorrectTarfile
IncorrectTarfile :: FormatError -> IncorrectTarfile
newtype UnsupportedTarEntry
UnsupportedTarEntry :: Entry -> UnsupportedTarEntry
newtype InvalidMetaFile
InvalidMetaFile :: String -> InvalidMetaFile
newtype InvalidCabalFile
InvalidCabalFile :: String -> InvalidCabalFile
data InvalidRepresentationOfType
InvalidRepresentationOfType :: String -> String -> InvalidRepresentationOfType
data NoHackageTarballFound
NoHackageTarballFound :: NoHackageTarballFound
instance GHC.Show.Show Distribution.Hackage.DB.Errors.NoHackageTarballFound
instance GHC.Show.Show Distribution.Hackage.DB.Errors.InvalidRepresentationOfType
instance GHC.Show.Show Distribution.Hackage.DB.Errors.InvalidCabalFile
instance GHC.Show.Show Distribution.Hackage.DB.Errors.InvalidMetaFile
instance GHC.Show.Show Distribution.Hackage.DB.Errors.UnsupportedTarEntry
instance GHC.Show.Show Distribution.Hackage.DB.Errors.IncorrectTarfile
instance GHC.Show.Show a => GHC.Show.Show (Distribution.Hackage.DB.Errors.HackageDBPackageVersion a)
instance GHC.Show.Show a => GHC.Show.Show (Distribution.Hackage.DB.Errors.HackageDBPackageName a)
instance GHC.Show.Show a => GHC.Show.Show (Distribution.Hackage.DB.Errors.HackageDBTarball a)
instance GHC.Exception.Exception Distribution.Hackage.DB.Errors.NoHackageTarballFound
instance GHC.Exception.Exception Distribution.Hackage.DB.Errors.InvalidRepresentationOfType
instance GHC.Exception.Exception Distribution.Hackage.DB.Errors.InvalidCabalFile
instance GHC.Exception.Exception Distribution.Hackage.DB.Errors.InvalidMetaFile
instance GHC.Exception.Exception Distribution.Hackage.DB.Errors.UnsupportedTarEntry
instance GHC.Exception.Exception Distribution.Hackage.DB.Errors.IncorrectTarfile
instance (GHC.Show.Show a, Data.Typeable.Internal.Typeable a) => GHC.Exception.Exception (Distribution.Hackage.DB.Errors.HackageDBPackageVersion a)
instance (GHC.Show.Show a, Data.Typeable.Internal.Typeable a) => GHC.Exception.Exception (Distribution.Hackage.DB.Errors.HackageDBPackageName a)
instance (GHC.Show.Show a, Data.Typeable.Internal.Typeable a) => GHC.Exception.Exception (Distribution.Hackage.DB.Errors.HackageDBTarball a)


-- | Types and class instances for parsing the <tt>package.json</tt> files
--   found in a <tt>01-index.tar</tt> tarball from Hackage with
--   <a>Data.Aeson</a>. These parsers mirror the exact structure of those
--   files, but only a small part of it is actually of interest to anyone
--   other than implementors of <tt>cabal-install</tt>. Everyone else will
--   most likely prefer the functions oferred by
--   <a>Distribution.Hackage.DB.Parsed</a>.
module Distribution.Hackage.DB.MetaData

-- | Parse the <tt>package.json</tt> file found in a <tt>01-index.tar</tt>
--   tarball from Hackage with <a>Data.Aeson</a>. This function is a
--   convenience wrapper around <a>eitherDecode</a> that throws an
--   <a>InvalidMetaFile</a> exception to signal failure.
--   
--   <pre>
--   &gt;&gt;&gt; :set -XOverloadedStrings
--   
--   &gt;&gt;&gt; parseMetaData "{\"signatures\":[],\"signed\":{\"_type\":\"Targets\",\"expires\":null,\"targets\":{\"&lt;repo&gt;/package/jailbreak-cabal-1.3.2.tar.gz\":{\"hashes\":{\"md5\":\"ba42b3e68323ccbeb3ac900cd68f9e90\",\"sha256\":\"212a8bbc3dfc748c4063282414a2726709d651322f3984c9989179d2352950f4\"},\"length\":2269}},\"version\":0}}"
--   MetaData {signed = SignedMetaData {version = 0, expires = Nothing, _type = "Targets", targets = fromList [("&lt;repo&gt;/package/jailbreak-cabal-1.3.2.tar.gz",TargetData {length = 2269, hashes = fromList [("md5","ba42b3e68323ccbeb3ac900cd68f9e90"),("sha256","212a8bbc3dfc748c4063282414a2726709d651322f3984c9989179d2352950f4")]})]}, signatures = []}
--   
--   &gt;&gt;&gt; parseMetaData "{}"
--   *** Exception: InvalidMetaFile "Error in $: key \"signed\" not present"
--   
--   &gt;&gt;&gt; parseMetaData ""
--   *** Exception: InvalidMetaFile "Error in $: not enough input"
--   </pre>
parseMetaData :: ByteString -> MetaData
data MetaData
MetaData :: SignedMetaData -> [String] -> MetaData
[signed] :: MetaData -> SignedMetaData
[signatures] :: MetaData -> [String]
data SignedMetaData
SignedMetaData :: Int -> Maybe String -> String -> Map String TargetData -> SignedMetaData
[version] :: SignedMetaData -> Int
[expires] :: SignedMetaData -> Maybe String
[_type] :: SignedMetaData -> String
[targets] :: SignedMetaData -> Map String TargetData
data TargetData
TargetData :: Int -> Map String String -> TargetData
[length] :: TargetData -> Int
[hashes] :: TargetData -> Map String String
instance GHC.Generics.Generic Distribution.Hackage.DB.MetaData.MetaData
instance GHC.Show.Show Distribution.Hackage.DB.MetaData.MetaData
instance GHC.Generics.Generic Distribution.Hackage.DB.MetaData.SignedMetaData
instance GHC.Show.Show Distribution.Hackage.DB.MetaData.SignedMetaData
instance GHC.Generics.Generic Distribution.Hackage.DB.MetaData.TargetData
instance GHC.Show.Show Distribution.Hackage.DB.MetaData.TargetData
instance Data.Aeson.Types.FromJSON.FromJSON Distribution.Hackage.DB.MetaData.MetaData
instance Data.Aeson.Types.FromJSON.FromJSON Distribution.Hackage.DB.MetaData.SignedMetaData
instance Data.Aeson.Types.FromJSON.FromJSON Distribution.Hackage.DB.MetaData.TargetData


-- | Find the location of the local Hackage database that is maintained by
--   running <tt>cabal update</tt>.
module Distribution.Hackage.DB.Path
cabalStateDir :: IO FilePath
cabalTarballDir :: String -> IO FilePath
hackageTarballDir :: IO FilePath

-- | Determine the default path of the Hackage database, which typically
--   resides at
--   <tt>"$HOME/.cabal/packages/hackage.haskell.org/00-index.tar"</tt>.
--   Running the command <tt>"cabal update"</tt> will keep that file
--   up-to-date.
hackageTarball :: IO FilePath


module Distribution.Hackage.DB.Utility
parseText :: Text a => String -> String -> a

-- | Convert the the <a>EpochTime</a> used by the <tt>tar</tt> library into
--   a standard <a>UTCTime</a> type.
--   
--   <pre>
--   \et -&gt; toEpochTime (fromEpochTime et) == et
--   </pre>
fromEpochTime :: EpochTime -> UTCTime

-- | Convert the standard <a>UTCTime</a> type into the <a>EpochTime</a>
--   used by the <tt>tar</tt> library.
toEpochTime :: UTCTime -> EpochTime


module Distribution.Hackage.DB.Unparsed
type HackageDB = Map PackageName PackageData
data PackageData
PackageData :: ByteString -> Map Version VersionData -> PackageData
[preferredVersions] :: PackageData -> ByteString
[versions] :: PackageData -> Map Version VersionData
data VersionData
VersionData :: ByteString -> ByteString -> VersionData
[cabalFile] :: VersionData -> ByteString
[metaFile] :: VersionData -> ByteString
readTarball :: Maybe UTCTime -> FilePath -> IO HackageDB
parseTarball :: Maybe UTCTime -> FilePath -> ByteString -> HackageDB
instance GHC.Generics.Generic Distribution.Hackage.DB.Unparsed.PackageData
instance GHC.Classes.Eq Distribution.Hackage.DB.Unparsed.PackageData
instance GHC.Show.Show Distribution.Hackage.DB.Unparsed.PackageData
instance GHC.Generics.Generic Distribution.Hackage.DB.Unparsed.VersionData
instance GHC.Classes.Eq Distribution.Hackage.DB.Unparsed.VersionData
instance GHC.Show.Show Distribution.Hackage.DB.Unparsed.VersionData


module Distribution.Hackage.DB.Parsed
type HackageDB = Map PackageName PackageData
type PackageData = Map Version VersionData
data VersionData
VersionData :: !GenericPackageDescription -> !(Map String String) -> VersionData
[cabalFile] :: VersionData -> !GenericPackageDescription
[tarballHashes] :: VersionData -> !(Map String String)
readTarball :: Maybe UTCTime -> FilePath -> IO HackageDB
parseTarball :: Maybe UTCTime -> FilePath -> ByteString -> HackageDB
parseDB :: HackageDB -> HackageDB
parsePackageData :: PackageName -> PackageData -> PackageData
parseVersionData :: PackageName -> Version -> VersionData -> VersionData
parseMetaData :: PackageName -> Version -> ByteString -> Map String String
instance GHC.Generics.Generic Distribution.Hackage.DB.Parsed.VersionData
instance GHC.Classes.Eq Distribution.Hackage.DB.Parsed.VersionData
instance GHC.Show.Show Distribution.Hackage.DB.Parsed.VersionData


module Distribution.Hackage.DB
type HackageDB = Map PackageName PackageData
type PackageData = Map Version VersionData
data VersionData
VersionData :: !GenericPackageDescription -> !(Map String String) -> VersionData
[cabalFile] :: VersionData -> !GenericPackageDescription
[tarballHashes] :: VersionData -> !(Map String String)
readTarball :: Maybe UTCTime -> FilePath -> IO HackageDB
parseTarball :: Maybe UTCTime -> FilePath -> ByteString -> HackageDB

-- | Determine the default path of the Hackage database, which typically
--   resides at
--   <tt>"$HOME/.cabal/packages/hackage.haskell.org/00-index.tar"</tt>.
--   Running the command <tt>"cabal update"</tt> will keep that file
--   up-to-date.
hackageTarball :: IO FilePath
