-- GENERATED by C->Haskell Compiler, version 0.28.6 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Codec/Archive/Types/Foreign.chs" #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}

module Codec.Archive.Types.Foreign ( -- * Callbacks
                                     ArchiveReadCallback
                                   , ArchiveSkipCallback
                                   , ArchiveSeekCallback
                                   , ArchiveWriteCallback
                                   , ArchiveCloseCallbackRaw
                                   , ArchiveOpenCallbackRaw
                                   , ArchiveSwitchCallbackRaw
                                   , ArchivePassphraseCallback
                                   -- * Abstract types
                                   , Archive
                                   , ArchiveEntry
                                   , Stat
                                   , LinkResolver
                                   -- * Enum types
                                   , ArchiveResult (..)
                                   , FileType (..)
                                   , Symlink (..)
                                   -- * Macros
                                   , Flags (..)
                                   , ArchiveFilter (..)
                                   , ArchiveFormat (..)
                                   , ArchiveCapabilities (..)
                                   , ReadDiskFlags (..)
                                   , TimeFlag (..)
                                   , EntryACL (..)
                                   -- * libarchive types
                                   , LaInt64
                                   , LaSSize
                                   ) where
import qualified Foreign.C.Types as C2HSImp



import           Control.DeepSeq    (NFData)
import           Data.Bits          (Bits (..))
import           Foreign.C.String   (CString)
import           Foreign.C.Types    (CInt, CSize)
import           Foreign.Ptr        (Ptr)
import           GHC.Generics       (Generic)




type LaInt64 = (C2HSImp.CLong)
{-# LINE 45 "src/Codec/Archive/Types/Foreign.chs" #-}

type LaSSize = (C2HSImp.CLong)
{-# LINE 46 "src/Codec/Archive/Types/Foreign.chs" #-}


data ArchiveResult = ArchiveFatal
                   | ArchiveFailed
                   | ArchiveWarn
                   | ArchiveRetry
                   | ArchiveOk
                   | ArchiveEOF
  deriving (Eq,Show,Generic,NFData)
instance Enum ArchiveResult where
  succ ArchiveFatal = ArchiveFailed
  succ ArchiveFailed = ArchiveWarn
  succ ArchiveWarn = ArchiveRetry
  succ ArchiveRetry = ArchiveOk
  succ ArchiveOk = ArchiveEOF
  succ ArchiveEOF = error "ArchiveResult.succ: ArchiveEOF has no successor"

  pred ArchiveFailed = ArchiveFatal
  pred ArchiveWarn = ArchiveFailed
  pred ArchiveRetry = ArchiveWarn
  pred ArchiveOk = ArchiveRetry
  pred ArchiveEOF = ArchiveOk
  pred ArchiveFatal = error "ArchiveResult.pred: ArchiveFatal has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from ArchiveEOF

  fromEnum ArchiveFatal = (-30)
  fromEnum ArchiveFailed = (-25)
  fromEnum ArchiveWarn = (-20)
  fromEnum ArchiveRetry = (-10)
  fromEnum ArchiveOk = 0
  fromEnum ArchiveEOF = 1

  toEnum (-30) = ArchiveFatal
  toEnum (-25) = ArchiveFailed
  toEnum (-20) = ArchiveWarn
  toEnum (-10) = ArchiveRetry
  toEnum 0 = ArchiveOk
  toEnum 1 = ArchiveEOF
  toEnum unmatched = error ("ArchiveResult.toEnum: Cannot match " ++ show unmatched)

{-# LINE 55 "src/Codec/Archive/Types/Foreign.chs" #-}


data FileType = FtFifo
              | FtCharacter
              | FtDirectory
              | FtBlock
              | FtRegular
              | FtLink
              | FtSocket
  deriving (Eq)
instance Enum FileType where
  succ FtFifo = FtCharacter
  succ FtCharacter = FtDirectory
  succ FtDirectory = FtBlock
  succ FtBlock = FtRegular
  succ FtRegular = FtLink
  succ FtLink = FtSocket
  succ FtSocket = error "FileType.succ: FtSocket has no successor"

  pred FtCharacter = FtFifo
  pred FtDirectory = FtCharacter
  pred FtBlock = FtDirectory
  pred FtRegular = FtBlock
  pred FtLink = FtRegular
  pred FtSocket = FtLink
  pred FtFifo = error "FileType.pred: FtFifo has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from FtSocket

  fromEnum FtFifo = 4096
  fromEnum FtCharacter = 8192
  fromEnum FtDirectory = 16384
  fromEnum FtBlock = 24576
  fromEnum FtRegular = 32768
  fromEnum FtLink = 40960
  fromEnum FtSocket = 49152

  toEnum 4096 = FtFifo
  toEnum 8192 = FtCharacter
  toEnum 16384 = FtDirectory
  toEnum 24576 = FtBlock
  toEnum 32768 = FtRegular
  toEnum 40960 = FtLink
  toEnum 49152 = FtSocket
  toEnum unmatched = error ("FileType.toEnum: Cannot match " ++ show unmatched)

{-# LINE 65 "src/Codec/Archive/Types/Foreign.chs" #-}


data Symlink = SymlinkUndefined
             | SymlinkFile
             | SymlinkDirectory
  deriving (Eq)
instance Enum Symlink where
  succ SymlinkUndefined = SymlinkFile
  succ SymlinkFile = SymlinkDirectory
  succ SymlinkDirectory = error "Symlink.succ: SymlinkDirectory has no successor"

  pred SymlinkFile = SymlinkUndefined
  pred SymlinkDirectory = SymlinkFile
  pred SymlinkUndefined = error "Symlink.pred: SymlinkUndefined has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from SymlinkDirectory

  fromEnum SymlinkUndefined = 0
  fromEnum SymlinkFile = 1
  fromEnum SymlinkDirectory = 2

  toEnum 0 = SymlinkUndefined
  toEnum 1 = SymlinkFile
  toEnum 2 = SymlinkDirectory
  toEnum unmatched = error ("Symlink.toEnum: Cannot match " ++ show unmatched)

{-# LINE 71 "src/Codec/Archive/Types/Foreign.chs" #-}


data ArchiveFilter = ArchiveFilterNone
                   | ArchiveFilterGzip
                   | ArchiveFilterBzip2
                   | ArchiveFilterCompress
                   | ArchiveFilterProgram
                   | ArchiveFilterLzma
                   | ArchiveFilterXz
                   | ArchiveFilterUu
                   | ArchiveFilterRpm
                   | ArchiveFilterLzip
                   | ArchiveFilterLrzip
                   | ArchiveFilterLzop
                   | ArchiveFilterGrzip
                   | ArchiveFilterLz4
                   | ArchiveFilterZstd
instance Enum ArchiveFilter where
  succ ArchiveFilterNone = ArchiveFilterGzip
  succ ArchiveFilterGzip = ArchiveFilterBzip2
  succ ArchiveFilterBzip2 = ArchiveFilterCompress
  succ ArchiveFilterCompress = ArchiveFilterProgram
  succ ArchiveFilterProgram = ArchiveFilterLzma
  succ ArchiveFilterLzma = ArchiveFilterXz
  succ ArchiveFilterXz = ArchiveFilterUu
  succ ArchiveFilterUu = ArchiveFilterRpm
  succ ArchiveFilterRpm = ArchiveFilterLzip
  succ ArchiveFilterLzip = ArchiveFilterLrzip
  succ ArchiveFilterLrzip = ArchiveFilterLzop
  succ ArchiveFilterLzop = ArchiveFilterGrzip
  succ ArchiveFilterGrzip = ArchiveFilterLz4
  succ ArchiveFilterLz4 = ArchiveFilterZstd
  succ ArchiveFilterZstd = error "ArchiveFilter.succ: ArchiveFilterZstd has no successor"

  pred ArchiveFilterGzip = ArchiveFilterNone
  pred ArchiveFilterBzip2 = ArchiveFilterGzip
  pred ArchiveFilterCompress = ArchiveFilterBzip2
  pred ArchiveFilterProgram = ArchiveFilterCompress
  pred ArchiveFilterLzma = ArchiveFilterProgram
  pred ArchiveFilterXz = ArchiveFilterLzma
  pred ArchiveFilterUu = ArchiveFilterXz
  pred ArchiveFilterRpm = ArchiveFilterUu
  pred ArchiveFilterLzip = ArchiveFilterRpm
  pred ArchiveFilterLrzip = ArchiveFilterLzip
  pred ArchiveFilterLzop = ArchiveFilterLrzip
  pred ArchiveFilterGrzip = ArchiveFilterLzop
  pred ArchiveFilterLz4 = ArchiveFilterGrzip
  pred ArchiveFilterZstd = ArchiveFilterLz4
  pred ArchiveFilterNone = error "ArchiveFilter.pred: ArchiveFilterNone has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from ArchiveFilterZstd

  fromEnum ArchiveFilterNone = 0
  fromEnum ArchiveFilterGzip = 1
  fromEnum ArchiveFilterBzip2 = 2
  fromEnum ArchiveFilterCompress = 3
  fromEnum ArchiveFilterProgram = 4
  fromEnum ArchiveFilterLzma = 5
  fromEnum ArchiveFilterXz = 6
  fromEnum ArchiveFilterUu = 7
  fromEnum ArchiveFilterRpm = 8
  fromEnum ArchiveFilterLzip = 9
  fromEnum ArchiveFilterLrzip = 10
  fromEnum ArchiveFilterLzop = 11
  fromEnum ArchiveFilterGrzip = 12
  fromEnum ArchiveFilterLz4 = 13
  fromEnum ArchiveFilterZstd = 14

  toEnum 0 = ArchiveFilterNone
  toEnum 1 = ArchiveFilterGzip
  toEnum 2 = ArchiveFilterBzip2
  toEnum 3 = ArchiveFilterCompress
  toEnum 4 = ArchiveFilterProgram
  toEnum 5 = ArchiveFilterLzma
  toEnum 6 = ArchiveFilterXz
  toEnum 7 = ArchiveFilterUu
  toEnum 8 = ArchiveFilterRpm
  toEnum 9 = ArchiveFilterLzip
  toEnum 10 = ArchiveFilterLrzip
  toEnum 11 = ArchiveFilterLzop
  toEnum 12 = ArchiveFilterGrzip
  toEnum 13 = ArchiveFilterLz4
  toEnum 14 = ArchiveFilterZstd
  toEnum unmatched = error ("ArchiveFilter.toEnum: Cannot match " ++ show unmatched)

{-# LINE 89 "src/Codec/Archive/Types/Foreign.chs" #-}


data ArchiveFormat = ArchiveFormatCpio
                   | ArchiveFormatCpioPosix
                   | ArchiveFormatCpioBinLe
                   | ArchiveFormatCpioBinBe
                   | ArchiveFormatCpioSvr4Nocrc
                   | ArchiveFormatCpioSvr4Crc
                   | ArchiveFormatCpioAfioLarge
                   | ArchiveFormatShar
                   | ArchiveFormatSharBase
                   | ArchiveFormatSharDump
                   | ArchiveFormatTar
                   | ArchiveFormatTarUstar
                   | ArchiveFormatTarPaxInterchange
                   | ArchiveFormatTarPaxRestricted
                   | ArchiveFormatTarGnutar
                   | ArchiveFormatIso9660
                   | ArchiveFormatIso9660Rockridge
                   | ArchiveFormatZip
                   | ArchiveFormatEmpty
                   | ArchiveFormatAr
                   | ArchiveFormatArGnu
                   | ArchiveFormatArBsd
                   | ArchiveFormatMtree
                   | ArchiveFormatRaw
                   | ArchiveFormatXar
                   | ArchiveFormatLha
                   | ArchiveFormatCab
                   | ArchiveFormatRar
                   | ArchiveFormat7zip
                   | ArchiveFormatWarc
                   | ArchiveFormatRarV5
  deriving (Eq)
instance Enum ArchiveFormat where
  succ ArchiveFormatCpio = ArchiveFormatCpioPosix
  succ ArchiveFormatCpioPosix = ArchiveFormatCpioBinLe
  succ ArchiveFormatCpioBinLe = ArchiveFormatCpioBinBe
  succ ArchiveFormatCpioBinBe = ArchiveFormatCpioSvr4Nocrc
  succ ArchiveFormatCpioSvr4Nocrc = ArchiveFormatCpioSvr4Crc
  succ ArchiveFormatCpioSvr4Crc = ArchiveFormatCpioAfioLarge
  succ ArchiveFormatCpioAfioLarge = ArchiveFormatShar
  succ ArchiveFormatShar = ArchiveFormatSharBase
  succ ArchiveFormatSharBase = ArchiveFormatSharDump
  succ ArchiveFormatSharDump = ArchiveFormatTar
  succ ArchiveFormatTar = ArchiveFormatTarUstar
  succ ArchiveFormatTarUstar = ArchiveFormatTarPaxInterchange
  succ ArchiveFormatTarPaxInterchange = ArchiveFormatTarPaxRestricted
  succ ArchiveFormatTarPaxRestricted = ArchiveFormatTarGnutar
  succ ArchiveFormatTarGnutar = ArchiveFormatIso9660
  succ ArchiveFormatIso9660 = ArchiveFormatIso9660Rockridge
  succ ArchiveFormatIso9660Rockridge = ArchiveFormatZip
  succ ArchiveFormatZip = ArchiveFormatEmpty
  succ ArchiveFormatEmpty = ArchiveFormatAr
  succ ArchiveFormatAr = ArchiveFormatArGnu
  succ ArchiveFormatArGnu = ArchiveFormatArBsd
  succ ArchiveFormatArBsd = ArchiveFormatMtree
  succ ArchiveFormatMtree = ArchiveFormatRaw
  succ ArchiveFormatRaw = ArchiveFormatXar
  succ ArchiveFormatXar = ArchiveFormatLha
  succ ArchiveFormatLha = ArchiveFormatCab
  succ ArchiveFormatCab = ArchiveFormatRar
  succ ArchiveFormatRar = ArchiveFormat7zip
  succ ArchiveFormat7zip = ArchiveFormatWarc
  succ ArchiveFormatWarc = ArchiveFormatRarV5
  succ ArchiveFormatRarV5 = error "ArchiveFormat.succ: ArchiveFormatRarV5 has no successor"

  pred ArchiveFormatCpioPosix = ArchiveFormatCpio
  pred ArchiveFormatCpioBinLe = ArchiveFormatCpioPosix
  pred ArchiveFormatCpioBinBe = ArchiveFormatCpioBinLe
  pred ArchiveFormatCpioSvr4Nocrc = ArchiveFormatCpioBinBe
  pred ArchiveFormatCpioSvr4Crc = ArchiveFormatCpioSvr4Nocrc
  pred ArchiveFormatCpioAfioLarge = ArchiveFormatCpioSvr4Crc
  pred ArchiveFormatShar = ArchiveFormatCpioAfioLarge
  pred ArchiveFormatSharBase = ArchiveFormatShar
  pred ArchiveFormatSharDump = ArchiveFormatSharBase
  pred ArchiveFormatTar = ArchiveFormatSharDump
  pred ArchiveFormatTarUstar = ArchiveFormatTar
  pred ArchiveFormatTarPaxInterchange = ArchiveFormatTarUstar
  pred ArchiveFormatTarPaxRestricted = ArchiveFormatTarPaxInterchange
  pred ArchiveFormatTarGnutar = ArchiveFormatTarPaxRestricted
  pred ArchiveFormatIso9660 = ArchiveFormatTarGnutar
  pred ArchiveFormatIso9660Rockridge = ArchiveFormatIso9660
  pred ArchiveFormatZip = ArchiveFormatIso9660Rockridge
  pred ArchiveFormatEmpty = ArchiveFormatZip
  pred ArchiveFormatAr = ArchiveFormatEmpty
  pred ArchiveFormatArGnu = ArchiveFormatAr
  pred ArchiveFormatArBsd = ArchiveFormatArGnu
  pred ArchiveFormatMtree = ArchiveFormatArBsd
  pred ArchiveFormatRaw = ArchiveFormatMtree
  pred ArchiveFormatXar = ArchiveFormatRaw
  pred ArchiveFormatLha = ArchiveFormatXar
  pred ArchiveFormatCab = ArchiveFormatLha
  pred ArchiveFormatRar = ArchiveFormatCab
  pred ArchiveFormat7zip = ArchiveFormatRar
  pred ArchiveFormatWarc = ArchiveFormat7zip
  pred ArchiveFormatRarV5 = ArchiveFormatWarc
  pred ArchiveFormatCpio = error "ArchiveFormat.pred: ArchiveFormatCpio has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from ArchiveFormatRarV5

  fromEnum ArchiveFormatCpio = 65536
  fromEnum ArchiveFormatCpioPosix = 65537
  fromEnum ArchiveFormatCpioBinLe = 65538
  fromEnum ArchiveFormatCpioBinBe = 65539
  fromEnum ArchiveFormatCpioSvr4Nocrc = 65540
  fromEnum ArchiveFormatCpioSvr4Crc = 65541
  fromEnum ArchiveFormatCpioAfioLarge = 65542
  fromEnum ArchiveFormatShar = 131072
  fromEnum ArchiveFormatSharBase = 131073
  fromEnum ArchiveFormatSharDump = 131074
  fromEnum ArchiveFormatTar = 196608
  fromEnum ArchiveFormatTarUstar = 196609
  fromEnum ArchiveFormatTarPaxInterchange = 196610
  fromEnum ArchiveFormatTarPaxRestricted = 196611
  fromEnum ArchiveFormatTarGnutar = 196612
  fromEnum ArchiveFormatIso9660 = 262144
  fromEnum ArchiveFormatIso9660Rockridge = 262145
  fromEnum ArchiveFormatZip = 327680
  fromEnum ArchiveFormatEmpty = 393216
  fromEnum ArchiveFormatAr = 458752
  fromEnum ArchiveFormatArGnu = 458753
  fromEnum ArchiveFormatArBsd = 458754
  fromEnum ArchiveFormatMtree = 524288
  fromEnum ArchiveFormatRaw = 589824
  fromEnum ArchiveFormatXar = 655360
  fromEnum ArchiveFormatLha = 720896
  fromEnum ArchiveFormatCab = 786432
  fromEnum ArchiveFormatRar = 851968
  fromEnum ArchiveFormat7zip = 917504
  fromEnum ArchiveFormatWarc = 983040
  fromEnum ArchiveFormatRarV5 = 1048576

  toEnum 65536 = ArchiveFormatCpio
  toEnum 65537 = ArchiveFormatCpioPosix
  toEnum 65538 = ArchiveFormatCpioBinLe
  toEnum 65539 = ArchiveFormatCpioBinBe
  toEnum 65540 = ArchiveFormatCpioSvr4Nocrc
  toEnum 65541 = ArchiveFormatCpioSvr4Crc
  toEnum 65542 = ArchiveFormatCpioAfioLarge
  toEnum 131072 = ArchiveFormatShar
  toEnum 131073 = ArchiveFormatSharBase
  toEnum 131074 = ArchiveFormatSharDump
  toEnum 196608 = ArchiveFormatTar
  toEnum 196609 = ArchiveFormatTarUstar
  toEnum 196610 = ArchiveFormatTarPaxInterchange
  toEnum 196611 = ArchiveFormatTarPaxRestricted
  toEnum 196612 = ArchiveFormatTarGnutar
  toEnum 262144 = ArchiveFormatIso9660
  toEnum 262145 = ArchiveFormatIso9660Rockridge
  toEnum 327680 = ArchiveFormatZip
  toEnum 393216 = ArchiveFormatEmpty
  toEnum 458752 = ArchiveFormatAr
  toEnum 458753 = ArchiveFormatArGnu
  toEnum 458754 = ArchiveFormatArBsd
  toEnum 524288 = ArchiveFormatMtree
  toEnum 589824 = ArchiveFormatRaw
  toEnum 655360 = ArchiveFormatXar
  toEnum 720896 = ArchiveFormatLha
  toEnum 786432 = ArchiveFormatCab
  toEnum 851968 = ArchiveFormatRar
  toEnum 917504 = ArchiveFormat7zip
  toEnum 983040 = ArchiveFormatWarc
  toEnum 1048576 = ArchiveFormatRarV5
  toEnum unmatched = error ("ArchiveFormat.toEnum: Cannot match " ++ show unmatched)

{-# LINE 123 "src/Codec/Archive/Types/Foreign.chs" #-}


-- | Abstract type
data Archive

-- | Abstract type
data ArchiveEntry

data Stat

data LinkResolver

type ArchiveReadCallback a b = Ptr Archive -> Ptr a -> Ptr (Ptr b) -> IO LaSSize
type ArchiveSkipCallback a = Ptr Archive -> Ptr a -> LaInt64 -> IO LaInt64
type ArchiveSeekCallback a = Ptr Archive -> Ptr a -> LaInt64 -> CInt -> IO LaInt64
type ArchiveWriteCallback a b = Ptr Archive -> Ptr a -> Ptr b -> CSize -> IO LaSSize
type ArchiveOpenCallbackRaw a = Ptr Archive -> Ptr a -> IO CInt
type ArchiveCloseCallbackRaw a = Ptr Archive -> Ptr a -> IO CInt
type ArchiveSwitchCallbackRaw a b = Ptr Archive -> Ptr a -> Ptr b -> IO CInt
type ArchivePassphraseCallback a = Ptr Archive -> Ptr a -> IO CString

newtype Flags = Flags CInt

newtype ReadDiskFlags = ReadDiskFlags CInt

newtype TimeFlag = TimeFlag CInt

newtype EntryACL = EntryACL CInt

newtype ArchiveCapabilities = ArchiveCapabilities CInt
    deriving (Eq)

instance Semigroup ArchiveCapabilities where
    (<>) (ArchiveCapabilities x) (ArchiveCapabilities y) = ArchiveCapabilities (x .|. y)

instance Monoid ArchiveCapabilities where
    mempty = ArchiveCapabilities 0
    mappend = (<>)

instance Semigroup ReadDiskFlags where
    (<>) (ReadDiskFlags x) (ReadDiskFlags y) = ReadDiskFlags (x .|. y)

instance Semigroup Flags where
    (<>) (Flags x) (Flags y) = Flags (x .|. y)

instance Monoid Flags where
    mempty = Flags 0
    mappend = (<>)

instance Semigroup EntryACL where
    (<>) (EntryACL x) (EntryACL y) = EntryACL (x .|. y)

-- TODO: `has` function for EntryACL