{-# language BangPatterns #-}
{-# language BinaryLiterals #-}
{-# language DataKinds #-}
{-# language DeriveFunctor #-}
{-# language DerivingStrategies #-}
{-# language GADTSyntax #-}
{-# language KindSignatures #-}
{-# language LambdaCase #-}
{-# language MagicHash #-}
{-# language MultiWayIf #-}
{-# language PolyKinds #-}
{-# language RankNTypes #-}
{-# language ScopedTypeVariables #-}
{-# language StandaloneDeriving #-}
{-# language TypeApplications #-}
{-# language UnboxedSums #-}
{-# language UnboxedTuples #-}
module Data.Bytes.Parser.Unsafe
( cursor
, expose
, unconsume
, jump
) where
import Prelude hiding (length)
import Data.Primitive (ByteArray)
import Data.Bytes.Types (Bytes(..))
import Data.Bytes.Parser.Internal (Parser(..),uneffectful)
import Data.Bytes.Parser.Internal (InternalResult(..))
cursor :: Parser e s Int
cursor = uneffectful $ \chunk ->
InternalSuccess (offset chunk) (offset chunk) (length chunk)
expose :: Parser e s ByteArray
expose = uneffectful $ \chunk ->
InternalSuccess (array chunk) (offset chunk) (length chunk)
unconsume :: Int -> Parser e s ()
unconsume n = uneffectful $ \chunk ->
InternalSuccess () (offset chunk - n) (length chunk + n)
jump :: Int -> Parser e s ()
jump ix = uneffectful $ \chunk ->
InternalSuccess () ix (length chunk + (offset chunk - ix))