{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE TypeSynonymInstances #-}

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

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

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

fromByteString :: BS.ByteString -> JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)
fromByteString :: ByteString -> JsonCursor ByteString CsPoppy (RangeMin CsPoppy)
fromByteString ByteString
bs = JsonCursor :: forall t v w. t -> v -> w -> Count -> JsonCursor t v w
JsonCursor
  { cursorText :: ByteString
cursorText      = ByteString
bs
  , interests :: CsPoppy
interests       = Vector Count -> CsPoppy
makeCsPoppy Vector Count
ib
  , balancedParens :: RangeMin CsPoppy
balancedParens  = CsPoppy -> RangeMin CsPoppy
forall a. AsVector64 a => a -> RangeMin a
RM.mkRangeMin (Vector Count -> CsPoppy
makeCsPoppy Vector Count
bp)
  , cursorRank :: Count
cursorRank      = Count
1
  }
  where J.IbBp Vector Count
ib Vector Count
bp = ByteString -> IbBp
forall a. ToIbBp a => a -> IbBp
J.toIbBp ByteString
bs

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

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