{-# LANGUAGE BangPatterns #-}

module HaskellWorks.Data.Json.Standard.Cursor.Load.Cursor
  ( loadCursor
  , loadCursorWithIndex
  , loadCursorWithCsPoppyIndex
  , loadCursorWithCsPoppyIndex2
  ) where

import Data.Word
import HaskellWorks.Data.BalancedParens.Simple
import HaskellWorks.Data.Json.Standard.Cursor.Generic
import HaskellWorks.Data.Json.Standard.Cursor.Load.Raw
import HaskellWorks.Data.RankSelect.CsPoppy1

import qualified Data.ByteString.Internal                    as BSI
import qualified Data.Vector.Storable                        as DVS
import qualified HaskellWorks.Data.ByteString                as BS
import qualified HaskellWorks.Data.Json.Standard.Cursor.Fast as FAST

loadCursor :: String -> IO FAST.Cursor
loadCursor :: String -> IO Cursor
loadCursor String
path = do
  ByteString
bs <- String -> IO ByteString
BS.mmap String
path
  let !cursor :: Cursor
cursor = ByteString -> Cursor
FAST.fromByteStringViaBlanking ByteString
bs
  Cursor -> IO Cursor
forall (m :: * -> *) a. Monad m => a -> m a
return Cursor
cursor

loadCursorWithIndex :: String -> IO (GenericCursor BSI.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64)))
loadCursorWithIndex :: String
-> IO
     (GenericCursor
        ByteString (Vector Word64) (SimpleBalancedParens (Vector Word64)))
loadCursorWithIndex String
filename = do
  (ByteString
jsonBS, Vector Word64
jsonIb, Vector Word64
jsonBp) <- String -> IO (ByteString, Vector Word64, Vector Word64)
loadRawWithIndex String
filename
  let cursor :: GenericCursor
  ByteString (Vector Word64) (SimpleBalancedParens (Vector Word64))
cursor = ByteString
-> Vector Word64
-> SimpleBalancedParens (Vector Word64)
-> Word64
-> GenericCursor
     ByteString (Vector Word64) (SimpleBalancedParens (Vector Word64))
forall t v w. t -> v -> w -> Word64 -> GenericCursor t v w
GenericCursor ByteString
jsonBS Vector Word64
jsonIb (Vector Word64 -> SimpleBalancedParens (Vector Word64)
forall a. a -> SimpleBalancedParens a
SimpleBalancedParens Vector Word64
jsonBp) Word64
1
  GenericCursor
  ByteString (Vector Word64) (SimpleBalancedParens (Vector Word64))
-> IO
     (GenericCursor
        ByteString (Vector Word64) (SimpleBalancedParens (Vector Word64)))
forall (m :: * -> *) a. Monad m => a -> m a
return GenericCursor
  ByteString (Vector Word64) (SimpleBalancedParens (Vector Word64))
cursor

loadCursorWithCsPoppyIndex :: String -> IO (GenericCursor BSI.ByteString CsPoppy1 (SimpleBalancedParens (DVS.Vector Word64)))
loadCursorWithCsPoppyIndex :: String
-> IO
     (GenericCursor
        ByteString CsPoppy1 (SimpleBalancedParens (Vector Word64)))
loadCursorWithCsPoppyIndex String
filename = do
  (ByteString
jsonBS, Vector Word64
jsonIb, Vector Word64
jsonBp) <- String -> IO (ByteString, Vector Word64, Vector Word64)
loadRawWithIndex String
filename
  let cursor :: GenericCursor
  ByteString CsPoppy1 (SimpleBalancedParens (Vector Word64))
cursor = ByteString
-> CsPoppy1
-> SimpleBalancedParens (Vector Word64)
-> Word64
-> GenericCursor
     ByteString CsPoppy1 (SimpleBalancedParens (Vector Word64))
forall t v w. t -> v -> w -> Word64 -> GenericCursor t v w
GenericCursor ByteString
jsonBS (Vector Word64 -> CsPoppy1
makeCsPoppy Vector Word64
jsonIb) (Vector Word64 -> SimpleBalancedParens (Vector Word64)
forall a. a -> SimpleBalancedParens a
SimpleBalancedParens Vector Word64
jsonBp) Word64
1
  GenericCursor
  ByteString CsPoppy1 (SimpleBalancedParens (Vector Word64))
-> IO
     (GenericCursor
        ByteString CsPoppy1 (SimpleBalancedParens (Vector Word64)))
forall (m :: * -> *) a. Monad m => a -> m a
return GenericCursor
  ByteString CsPoppy1 (SimpleBalancedParens (Vector Word64))
cursor

loadCursorWithCsPoppyIndex2 :: String -> IO (GenericCursor BSI.ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1))
loadCursorWithCsPoppyIndex2 :: String
-> IO
     (GenericCursor ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1))
loadCursorWithCsPoppyIndex2 String
filename = do
  (ByteString
jsonBS, Vector Word64
jsonIb, Vector Word64
jsonBp) <- String -> IO (ByteString, Vector Word64, Vector Word64)
loadRawWithIndex String
filename
  let cursor :: GenericCursor ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1)
cursor = ByteString
-> CsPoppy1
-> SimpleBalancedParens CsPoppy1
-> Word64
-> GenericCursor
     ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1)
forall t v w. t -> v -> w -> Word64 -> GenericCursor t v w
GenericCursor ByteString
jsonBS (Vector Word64 -> CsPoppy1
makeCsPoppy Vector Word64
jsonIb) (CsPoppy1 -> SimpleBalancedParens CsPoppy1
forall a. a -> SimpleBalancedParens a
SimpleBalancedParens (Vector Word64 -> CsPoppy1
makeCsPoppy Vector Word64
jsonBp)) Word64
1
                :: GenericCursor BSI.ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1)
  GenericCursor ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1)
-> IO
     (GenericCursor ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1))
forall (m :: * -> *) a. Monad m => a -> m a
return GenericCursor ByteString CsPoppy1 (SimpleBalancedParens CsPoppy1)
cursor