module Data.Grib.Raw.Error ( ErrorCode(..) ) where
data ErrorCode = GribInvalidKeyValue
               | GribValueDifferent
               | GribDifferentEdition
               | GribInvalidBpv
               | GribCorruptedIndex
               | GribMessageMalformed
               | GribUnderflow
               | GribSwitchNoMatch
               | GribConstantField
               | GribMessageTooLarge
               | GribInternalArrayTooSmall
               | GribPrematureEndOfFile
               | GribNullIndex
               | GribEndOfIndex
               | GribWrongGrid
               | GribNoValues
               | GribEnd
               | GribWrongType
               | GribNoDefinitions
               | GribConceptNoMatch
               | GribOutOfArea
               | GribMissingKey
               | GribInvalidOrderby
               | GribInvalidNearest
               | GribInvalidKeysIterator
               | GribInvalidIterator
               | GribInvalidIndex
               | GribInvalidGrib
               | GribInvalidFile
               | GribWrongStepUnit
               | GribWrongStep
               | GribInvalidType
               | GribWrongLength
               | GribValueCannotBeMissing
               | GribInvalidSectionNumber
               | GribNullHandle
               | GribInvalidArgument
               | GribReadOnly
               | GribOutOfMemory
               | GribGeocalculusProblem
               | GribNoMoreInSet
               | GribEncodingError
               | GribDecodingError
               | GribInvalidMessage
               | GribIoProblem
               | GribNotFound
               | GribWrongArraySize
               | GribCodeNotFoundInTable
               | GribFileNotFound
               | GribArrayTooSmall
               | Grib7777NotFound
               | GribNotImplemented
               | GribBufferTooSmall
               | GribInternalError
               | GribEndOfFile
               | GribSuccess
  deriving (Eq,Show)
instance Enum ErrorCode where
  succ GribInvalidKeyValue = GribValueDifferent
  succ GribValueDifferent = GribDifferentEdition
  succ GribDifferentEdition = GribInvalidBpv
  succ GribInvalidBpv = GribCorruptedIndex
  succ GribCorruptedIndex = GribMessageMalformed
  succ GribMessageMalformed = GribUnderflow
  succ GribUnderflow = GribSwitchNoMatch
  succ GribSwitchNoMatch = GribConstantField
  succ GribConstantField = GribMessageTooLarge
  succ GribMessageTooLarge = GribInternalArrayTooSmall
  succ GribInternalArrayTooSmall = GribPrematureEndOfFile
  succ GribPrematureEndOfFile = GribNullIndex
  succ GribNullIndex = GribEndOfIndex
  succ GribEndOfIndex = GribWrongGrid
  succ GribWrongGrid = GribNoValues
  succ GribNoValues = GribEnd
  succ GribEnd = GribWrongType
  succ GribWrongType = GribNoDefinitions
  succ GribNoDefinitions = GribConceptNoMatch
  succ GribConceptNoMatch = GribOutOfArea
  succ GribOutOfArea = GribMissingKey
  succ GribMissingKey = GribInvalidOrderby
  succ GribInvalidOrderby = GribInvalidNearest
  succ GribInvalidNearest = GribInvalidKeysIterator
  succ GribInvalidKeysIterator = GribInvalidIterator
  succ GribInvalidIterator = GribInvalidIndex
  succ GribInvalidIndex = GribInvalidGrib
  succ GribInvalidGrib = GribInvalidFile
  succ GribInvalidFile = GribWrongStepUnit
  succ GribWrongStepUnit = GribWrongStep
  succ GribWrongStep = GribInvalidType
  succ GribInvalidType = GribWrongLength
  succ GribWrongLength = GribValueCannotBeMissing
  succ GribValueCannotBeMissing = GribInvalidSectionNumber
  succ GribInvalidSectionNumber = GribNullHandle
  succ GribNullHandle = GribInvalidArgument
  succ GribInvalidArgument = GribReadOnly
  succ GribReadOnly = GribOutOfMemory
  succ GribOutOfMemory = GribGeocalculusProblem
  succ GribGeocalculusProblem = GribNoMoreInSet
  succ GribNoMoreInSet = GribEncodingError
  succ GribEncodingError = GribDecodingError
  succ GribDecodingError = GribInvalidMessage
  succ GribInvalidMessage = GribIoProblem
  succ GribIoProblem = GribNotFound
  succ GribNotFound = GribWrongArraySize
  succ GribWrongArraySize = GribCodeNotFoundInTable
  succ GribCodeNotFoundInTable = GribFileNotFound
  succ GribFileNotFound = GribArrayTooSmall
  succ GribArrayTooSmall = Grib7777NotFound
  succ Grib7777NotFound = GribNotImplemented
  succ GribNotImplemented = GribBufferTooSmall
  succ GribBufferTooSmall = GribInternalError
  succ GribInternalError = GribEndOfFile
  succ GribEndOfFile = GribSuccess
  succ GribSuccess = error "ErrorCode.succ: GribSuccess has no successor"
  pred GribValueDifferent = GribInvalidKeyValue
  pred GribDifferentEdition = GribValueDifferent
  pred GribInvalidBpv = GribDifferentEdition
  pred GribCorruptedIndex = GribInvalidBpv
  pred GribMessageMalformed = GribCorruptedIndex
  pred GribUnderflow = GribMessageMalformed
  pred GribSwitchNoMatch = GribUnderflow
  pred GribConstantField = GribSwitchNoMatch
  pred GribMessageTooLarge = GribConstantField
  pred GribInternalArrayTooSmall = GribMessageTooLarge
  pred GribPrematureEndOfFile = GribInternalArrayTooSmall
  pred GribNullIndex = GribPrematureEndOfFile
  pred GribEndOfIndex = GribNullIndex
  pred GribWrongGrid = GribEndOfIndex
  pred GribNoValues = GribWrongGrid
  pred GribEnd = GribNoValues
  pred GribWrongType = GribEnd
  pred GribNoDefinitions = GribWrongType
  pred GribConceptNoMatch = GribNoDefinitions
  pred GribOutOfArea = GribConceptNoMatch
  pred GribMissingKey = GribOutOfArea
  pred GribInvalidOrderby = GribMissingKey
  pred GribInvalidNearest = GribInvalidOrderby
  pred GribInvalidKeysIterator = GribInvalidNearest
  pred GribInvalidIterator = GribInvalidKeysIterator
  pred GribInvalidIndex = GribInvalidIterator
  pred GribInvalidGrib = GribInvalidIndex
  pred GribInvalidFile = GribInvalidGrib
  pred GribWrongStepUnit = GribInvalidFile
  pred GribWrongStep = GribWrongStepUnit
  pred GribInvalidType = GribWrongStep
  pred GribWrongLength = GribInvalidType
  pred GribValueCannotBeMissing = GribWrongLength
  pred GribInvalidSectionNumber = GribValueCannotBeMissing
  pred GribNullHandle = GribInvalidSectionNumber
  pred GribInvalidArgument = GribNullHandle
  pred GribReadOnly = GribInvalidArgument
  pred GribOutOfMemory = GribReadOnly
  pred GribGeocalculusProblem = GribOutOfMemory
  pred GribNoMoreInSet = GribGeocalculusProblem
  pred GribEncodingError = GribNoMoreInSet
  pred GribDecodingError = GribEncodingError
  pred GribInvalidMessage = GribDecodingError
  pred GribIoProblem = GribInvalidMessage
  pred GribNotFound = GribIoProblem
  pred GribWrongArraySize = GribNotFound
  pred GribCodeNotFoundInTable = GribWrongArraySize
  pred GribFileNotFound = GribCodeNotFoundInTable
  pred GribArrayTooSmall = GribFileNotFound
  pred Grib7777NotFound = GribArrayTooSmall
  pred GribNotImplemented = Grib7777NotFound
  pred GribBufferTooSmall = GribNotImplemented
  pred GribInternalError = GribBufferTooSmall
  pred GribEndOfFile = GribInternalError
  pred GribSuccess = GribEndOfFile
  pred GribInvalidKeyValue = error "ErrorCode.pred: GribInvalidKeyValue 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 GribSuccess
  fromEnum GribInvalidKeyValue = (55)
  fromEnum GribValueDifferent = (54)
  fromEnum GribDifferentEdition = (53)
  fromEnum GribInvalidBpv = (52)
  fromEnum GribCorruptedIndex = (51)
  fromEnum GribMessageMalformed = (50)
  fromEnum GribUnderflow = (49)
  fromEnum GribSwitchNoMatch = (48)
  fromEnum GribConstantField = (47)
  fromEnum GribMessageTooLarge = (46)
  fromEnum GribInternalArrayTooSmall = (45)
  fromEnum GribPrematureEndOfFile = (44)
  fromEnum GribNullIndex = (43)
  fromEnum GribEndOfIndex = (42)
  fromEnum GribWrongGrid = (41)
  fromEnum GribNoValues = (40)
  fromEnum GribEnd = (39)
  fromEnum GribWrongType = (38)
  fromEnum GribNoDefinitions = (37)
  fromEnum GribConceptNoMatch = (36)
  fromEnum GribOutOfArea = (35)
  fromEnum GribMissingKey = (34)
  fromEnum GribInvalidOrderby = (33)
  fromEnum GribInvalidNearest = (32)
  fromEnum GribInvalidKeysIterator = (31)
  fromEnum GribInvalidIterator = (30)
  fromEnum GribInvalidIndex = (29)
  fromEnum GribInvalidGrib = (28)
  fromEnum GribInvalidFile = (27)
  fromEnum GribWrongStepUnit = (26)
  fromEnum GribWrongStep = (25)
  fromEnum GribInvalidType = (24)
  fromEnum GribWrongLength = (23)
  fromEnum GribValueCannotBeMissing = (22)
  fromEnum GribInvalidSectionNumber = (21)
  fromEnum GribNullHandle = (20)
  fromEnum GribInvalidArgument = (19)
  fromEnum GribReadOnly = (18)
  fromEnum GribOutOfMemory = (17)
  fromEnum GribGeocalculusProblem = (16)
  fromEnum GribNoMoreInSet = (15)
  fromEnum GribEncodingError = (14)
  fromEnum GribDecodingError = (13)
  fromEnum GribInvalidMessage = (12)
  fromEnum GribIoProblem = (11)
  fromEnum GribNotFound = (10)
  fromEnum GribWrongArraySize = (9)
  fromEnum GribCodeNotFoundInTable = (8)
  fromEnum GribFileNotFound = (7)
  fromEnum GribArrayTooSmall = (6)
  fromEnum Grib7777NotFound = (5)
  fromEnum GribNotImplemented = (4)
  fromEnum GribBufferTooSmall = (3)
  fromEnum GribInternalError = (2)
  fromEnum GribEndOfFile = (1)
  fromEnum GribSuccess = 0
  toEnum (55) = GribInvalidKeyValue
  toEnum (54) = GribValueDifferent
  toEnum (53) = GribDifferentEdition
  toEnum (52) = GribInvalidBpv
  toEnum (51) = GribCorruptedIndex
  toEnum (50) = GribMessageMalformed
  toEnum (49) = GribUnderflow
  toEnum (48) = GribSwitchNoMatch
  toEnum (47) = GribConstantField
  toEnum (46) = GribMessageTooLarge
  toEnum (45) = GribInternalArrayTooSmall
  toEnum (44) = GribPrematureEndOfFile
  toEnum (43) = GribNullIndex
  toEnum (42) = GribEndOfIndex
  toEnum (41) = GribWrongGrid
  toEnum (40) = GribNoValues
  toEnum (39) = GribEnd
  toEnum (38) = GribWrongType
  toEnum (37) = GribNoDefinitions
  toEnum (36) = GribConceptNoMatch
  toEnum (35) = GribOutOfArea
  toEnum (34) = GribMissingKey
  toEnum (33) = GribInvalidOrderby
  toEnum (32) = GribInvalidNearest
  toEnum (31) = GribInvalidKeysIterator
  toEnum (30) = GribInvalidIterator
  toEnum (29) = GribInvalidIndex
  toEnum (28) = GribInvalidGrib
  toEnum (27) = GribInvalidFile
  toEnum (26) = GribWrongStepUnit
  toEnum (25) = GribWrongStep
  toEnum (24) = GribInvalidType
  toEnum (23) = GribWrongLength
  toEnum (22) = GribValueCannotBeMissing
  toEnum (21) = GribInvalidSectionNumber
  toEnum (20) = GribNullHandle
  toEnum (19) = GribInvalidArgument
  toEnum (18) = GribReadOnly
  toEnum (17) = GribOutOfMemory
  toEnum (16) = GribGeocalculusProblem
  toEnum (15) = GribNoMoreInSet
  toEnum (14) = GribEncodingError
  toEnum (13) = GribDecodingError
  toEnum (12) = GribInvalidMessage
  toEnum (11) = GribIoProblem
  toEnum (10) = GribNotFound
  toEnum (9) = GribWrongArraySize
  toEnum (8) = GribCodeNotFoundInTable
  toEnum (7) = GribFileNotFound
  toEnum (6) = GribArrayTooSmall
  toEnum (5) = Grib7777NotFound
  toEnum (4) = GribNotImplemented
  toEnum (3) = GribBufferTooSmall
  toEnum (2) = GribInternalError
  toEnum (1) = GribEndOfFile
  toEnum 0 = GribSuccess
  toEnum unmatched = error ("ErrorCode.toEnum: Cannot match " ++ show unmatched)