content: {-# OPTIONS #-}
  
  -- ----------------------------------------------------------------------------
  
  {- |
    Module     : Holumbus.Index.Common.LoadStore
    Copyright  : Copyright (C) 2011 Sebastian M. Schlatt, Timo B. Huebel, UweSchmidt
    License    : MIT
  
    Maintainer : Timo B. Huebel (tbh@holumbus.org)
    Stability  : experimental
    Portability: none portable
  
    Load and store indexes
  
  -}
  
  -- ----------------------------------------------------------------------------
  
  module Holumbus.Index.Common.LoadStore
  where
  
  import Data.Binary      ( Binary (..) )
  import qualified
         Data.Binary      as B
  
  import qualified
         Data.List        as L
  
  import Text.XML.HXT.Core
  
  -- ------------------------------------------------------------
  
  -- | Try to determine the file type automatically. The file is loaded as XML if the filename
  -- ends with \".xml\" and otherwise is loaded as binary file.
  
  loadFromFile :: (XmlPickler a, Binary a) => FilePath -> IO a
  loadFromFile f = if L.isSuffixOf ".xml" f then loadFromXmlFile f else loadFromBinFile f
   
  -- | Load from XML file.
  
  loadFromXmlFile :: XmlPickler a => FilePath -> IO a
  loadFromXmlFile f = do
                      r <- runX (xunpickleDocument xpickle options f)
                      return $! head r
                      where
                      options = [ withRemoveWS yes, withInputEncoding utf8, withValidate no ]     
  
  -- | Write to XML file.
  
  writeToXmlFile :: XmlPickler a => FilePath -> a -> IO ()
  writeToXmlFile f i = do
                       runX (constA i >>> xpickleDocument xpickle options f)
                        >> return ()
                       where
                       options = [ withIndent yes, withOutputEncoding utf8 ]
  
  -- | Load from a binary file.
  
  loadFromBinFile :: Binary a => FilePath -> IO a
  loadFromBinFile = B.decodeFile
  
  -- | Write to a binary file.
  
  writeToBinFile :: Binary a => FilePath -> a -> IO ()
  writeToBinFile = B.encodeFile
  
  -- ------------------------------------------------------------
  