hw-xml-0.4.0.0: app/App/Naive.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeSynonymInstances #-}
module App.Naive
( loadSlowCursor
, loadFastCursor
) where
import HaskellWorks.Data.BalancedParens.RangeMin2
import HaskellWorks.Data.BalancedParens.Simple
import HaskellWorks.Data.Bits.BitShown
import HaskellWorks.Data.FromByteString
import HaskellWorks.Data.RankSelect.CsPoppy1
import HaskellWorks.Data.Xml.Succinct.Cursor
import HaskellWorks.Data.Xml.Succinct.Cursor.MMap
import qualified Data.ByteString as BS
-- | Load an XML file into memory and return a raw cursor initialised to the
-- start of the XML document.
loadSlowCursor :: String -> IO SlowCursor
loadSlowCursor path = do
!bs <- BS.readFile path
let !cursor = fromByteString bs :: SlowCursor
return cursor
-- | Load an XML file into memory and return a query-optimised cursor initialised
-- to the start of the XML document.
loadFastCursor :: String -> IO FastCursor
loadFastCursor filename = do
-- Load the XML file into memory as a raw cursor.
-- The raw XML data is `text`, and `ib` and `bp` are the indexes.
-- `ib` and `bp` can be persisted to an index file for later use to avoid
-- re-parsing the file.
XmlCursor !text (BitShown !ib) (SimpleBalancedParens !bp) _ <- loadSlowCursor filename
let !bpCsPoppy = makeCsPoppy bp
let !rangeMinMax = mkRangeMin2 bpCsPoppy
let !ibCsPoppy = makeCsPoppy ib
return $ XmlCursor text ibCsPoppy rangeMinMax 1