content: {-# LANGUAGE CPP                #-}
  {-# LANGUAGE DeriveAnyClass     #-}
  {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE DeriveGeneric      #-}
  {-# LANGUAGE FlexibleInstances  #-}
  
  -- | Shared types.
  
  module Xeno.Types where
  
  import Control.DeepSeq
  import Control.Exception
  import Data.ByteString.Char8 (ByteString, pack)
  import Data.Data
  import GHC.Generics
  
  #if MIN_VERSION_base(4,9,0)
  import Control.Monad.Fail
  
  -- It is recommended to use more specific `failHere` instead
  instance MonadFail (Either Xeno.Types.XenoException) where
    fail = Left . XenoParseError 0 . pack
  #endif
  
  data XenoException
    = XenoStringIndexProblem { stringIndex :: Int, inputString :: ByteString }
    | XenoParseError         { inputIndex  :: Int, message     :: ByteString }
    | XenoExpectRootNode
    deriving (Show, Data, Typeable, NFData, Generic)
  
  instance Exception XenoException where displayException = show
  
  -- | ByteString wich guaranted have '\NUL' at the end
  newtype ByteStringZeroTerminated = BSZT ByteString deriving (Generic, NFData)
  
  