packages feed

succinct-0.0.0.1: components/succinct-xml/src/Data/Succinct/Xml/Succinct/Cursor/Create.hs

module Data.Succinct.Xml.Succinct.Cursor.Create
  ( byteStringAsFastCursor
  , byteStringAsSlowCursor
  ) where

import Data.Coerce
import Data.Succinct.BalancedParens.RangeMin2
import Data.Succinct.BalancedParens.Simple
import Data.Succinct.RankSelect.CsPoppy1
import Data.Succinct.Xml.Succinct.Cursor
import Data.Succinct.Xml.Succinct.Cursor.BlankedXml
import Data.Succinct.Xml.Succinct.Cursor.Types
import HaskellWorks.Data.Bits.BitShown
import HaskellWorks.Data.Vector.Storable

import qualified Data.ByteString                     as BS
import qualified Data.Succinct.Xml.Internal.ToIbBp64 as I

byteStringAsSlowCursor :: BS.ByteString -> SlowCursor
byteStringAsSlowCursor bs = XmlCursor
  { cursorText      = bs
  , interests       = BitShown ib
  , balancedParens  = SimpleBalancedParens bp
  , cursorRank      = 1
  }
  where blankedXml  = bsToBlankedXml bs
        bsLen       = BS.length bs
        idxLen      = (bsLen + 7) `div` 8
        (ib, bp)    = construct64UnzipN idxLen (I.toIbBp64 blankedXml)

byteStringAsFastCursor :: BS.ByteString -> FastCursor
byteStringAsFastCursor bs = XmlCursor bs ibCsPoppy rangeMinMax r
  where XmlCursor _ ib bp r = byteStringAsSlowCursor bs
        bpCsPoppy           = makeCsPoppy (coerce bp)
        rangeMinMax         = mkRangeMin2 bpCsPoppy
        ibCsPoppy           = makeCsPoppy (coerce ib)