packages feed

succinct-0.0.0.1: components/succinct-json-simple-cursor/src/Data/Succinct/Json/Simple/Cursor/Fast.hs

module Data.Succinct.Json.Simple.Cursor.Fast
  ( fromByteString
  , fromForeignRegion
  , fromString
  ) where

import Foreign.ForeignPtr
import Data.Succinct.Json.Simple.Cursor
import Data.Succinct.RankSelect.CsPoppy

import qualified Data.ByteString                                  as BS
import qualified Data.ByteString.Char8                            as BSC
import qualified Data.ByteString.Internal                         as BSI
import qualified Data.Succinct.BalancedParens.RangeMin            as RM
import qualified Data.Succinct.Json.Simple.Cursor.Internal.IbBp   as J
import qualified Data.Succinct.Json.Simple.Cursor.Internal.ToIbBp as J
import qualified HaskellWorks.Data.FromForeignRegion              as F

fromByteString :: BS.ByteString -> JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)
fromByteString bs = JsonCursor
  { cursorText      = bs
  , interests       = makeCsPoppy ib
  , balancedParens  = RM.mkRangeMin (makeCsPoppy bp)
  , cursorRank      = 1
  }
  where J.IbBp ib bp = J.toIbBp bs

fromForeignRegion :: F.ForeignRegion -> JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)
fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)

fromString :: String -> JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)
fromString = fromByteString . BSC.pack