{-# LANGUAGE TypeFamilies #-}

module HaskellWorks.Data.Json.Standard.Cursor.Slow
  ( Cursor
  , fromBsIbBp
  , fromByteString
  , fromForeignRegion
  , fromString
  ) where

import Data.Word
import Foreign.ForeignPtr
import HaskellWorks.Data.Json.Standard.Cursor.Generic
import HaskellWorks.Data.Json.Standard.Cursor.IbBp
import HaskellWorks.Data.Json.Standard.Cursor.Specific

import qualified Data.ByteString                             as BS
import qualified Data.ByteString.Char8                       as BSC
import qualified Data.ByteString.Internal                    as BSI
import qualified Data.Vector.Storable                        as DVS
import qualified HaskellWorks.Data.BalancedParens            as BP
import qualified HaskellWorks.Data.FromForeignRegion         as F
import qualified HaskellWorks.Data.Json.Standard.Cursor.IbBp as J

data Slow

instance SpecificCursor Slow where
  type CursorOf Slow = Cursor

type Cursor = GenericCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64))

fromBsIbBp :: BS.ByteString -> IbBp -> Cursor
fromBsIbBp :: ByteString -> IbBp -> Cursor
fromBsIbBp ByteString
bs IbBp
ibBp = GenericCursor :: forall t v w. t -> v -> w -> Count -> GenericCursor t v w
GenericCursor
  { cursorText :: ByteString
cursorText      = ByteString
bs
  , interests :: Vector Count
interests       = Vector Count
ibPart
  , balancedParens :: SimpleBalancedParens (Vector Count)
balancedParens  = Vector Count -> SimpleBalancedParens (Vector Count)
forall a. a -> SimpleBalancedParens a
BP.SimpleBalancedParens Vector Count
bpPart
  , cursorRank :: Count
cursorRank      = Count
1
  }
  where J.IbBp Vector Count
ibPart Vector Count
bpPart = IbBp
ibBp

fromByteString :: BS.ByteString -> Cursor
fromByteString :: ByteString -> Cursor
fromByteString ByteString
bs = ByteString -> IbBp -> Cursor
fromBsIbBp ByteString
bs (ByteString -> IbBp
J.slowToIbBp ByteString
bs)

fromForeignRegion :: F.ForeignRegion -> Cursor
fromForeignRegion :: ForeignRegion -> Cursor
fromForeignRegion (ForeignPtr Word8
fptr, Int
offset, Int
size) = ByteString -> Cursor
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 -> Cursor
fromString :: String -> Cursor
fromString = ByteString -> Cursor
fromByteString (ByteString -> Cursor)
-> (String -> ByteString) -> String -> Cursor
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BSC.pack