module Streamly.Internal.Data.Parser.ParserK.Type
    (
      Step (..)
    , Input (..)
    , ParseResult (..)
    , ParserK (..)
    , fromParser
    
    , fromPure
    , fromEffect
    , die
    )
where
#include "ArrayMacros.h"
#include "assert.hs"
#include "inline.hs"
import Control.Applicative (Alternative(..), liftA2)
import Control.Monad (MonadPlus(..), ap)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.Proxy (Proxy(..))
import GHC.Types (SPEC(..))
import Streamly.Internal.Data.Array.Type (Array(..))
import Streamly.Internal.Data.Unboxed (peekWith, sizeOf, Unbox)
import Streamly.Internal.System.IO (unsafeInlineIO)
import qualified Control.Monad.Fail as Fail
import qualified Streamly.Internal.Data.Array.Type as Array
import qualified Streamly.Internal.Data.Parser.ParserD.Type as ParserD
data Input a = None | Chunk {-# UNPACK #-} !(Array a)
data Step a m r =
    
    
      Done !Int r
      
      
      
    | Partial !Int (Input a -> m (Step a m r))
    | Continue !Int (Input a -> m (Step a m r))
    | Error !Int String
instance Functor m => Functor (Step a m) where
    fmap :: forall a b. (a -> b) -> Step a m a -> Step a m b
fmap a -> b
f (Done Int
n a
r) = forall a (m :: * -> *) r. Int -> r -> Step a m r
Done Int
n (a -> b
f a
r)
    fmap a -> b
f (Partial Int
n Input a -> m (Step a m a)
k) = forall a (m :: * -> *) r.
Int -> (Input a -> m (Step a m r)) -> Step a m r
Partial Int
n (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Input a -> m (Step a m a)
k)
    fmap a -> b
f (Continue Int
n Input a -> m (Step a m a)
k) = forall a (m :: * -> *) r.
Int -> (Input a -> m (Step a m r)) -> Step a m r
Continue Int
n (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Input a -> m (Step a m a)
k)
    fmap a -> b
_ (Error Int
n String
e) = forall a (m :: * -> *) r. Int -> String -> Step a m r
Error Int
n String
e
data ParseResult b =
      Success !Int !b      
    | Failure !Int !String 
instance Functor ParseResult where
    fmap :: forall a b. (a -> b) -> ParseResult a -> ParseResult b
fmap a -> b
f (Success Int
n a
b) = forall b. Int -> b -> ParseResult b
Success Int
n (a -> b
f a
b)
    fmap a -> b
_ (Failure Int
n String
e) = forall b. Int -> String -> ParseResult b
Failure Int
n String
e
newtype ParserK a m b = MkParser
    { forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser :: forall r.
           
           
           
           
           
           
           (ParseResult b -> Int -> Input a -> m (Step a m r))
           
           
           
           
           
           
           
           
           
           
        -> Int
           
           
        -> Int
           
           
           
           
        -> Input a
        -> m (Step a m r)
    }
instance Functor m => Functor (ParserK a m) where
    {-# INLINE fmap #-}
    fmap :: forall a b. (a -> b) -> ParserK a m a -> ParserK a m b
fmap a -> b
f ParserK a m a
parser = forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ \ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n Int
st Input a
arr ->
        let k1 :: ParseResult a -> Int -> Input a -> m (Step a m r)
k1 ParseResult a
res = ParseResult b -> Int -> Input a -> m (Step a m r)
k (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f ParseResult a
res)
         in forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m a
parser ParseResult a -> Int -> Input a -> m (Step a m r)
k1 Int
n Int
st Input a
arr
{-# INLINE fromPure #-}
fromPure :: b -> ParserK a m b
fromPure :: forall b a (m :: * -> *). b -> ParserK a m b
fromPure b
b = forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ \ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n Int
st Input a
arr -> ParseResult b -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> b -> ParseResult b
Success Int
n b
b) Int
st Input a
arr
{-# INLINE fromEffect #-}
fromEffect :: Monad m => m b -> ParserK a m b
fromEffect :: forall (m :: * -> *) b a. Monad m => m b -> ParserK a m b
fromEffect m b
eff =
    forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ \ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n Int
st Input a
arr -> m b
eff forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
b -> ParseResult b -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> b -> ParseResult b
Success Int
n b
b) Int
st Input a
arr
instance Monad m => Applicative (ParserK a m) where
    {-# INLINE pure #-}
    pure :: forall a. a -> ParserK a m a
pure = forall b a (m :: * -> *). b -> ParserK a m b
fromPure
    {-# INLINE (<*>) #-}
    <*> :: forall a b. ParserK a m (a -> b) -> ParserK a m a -> ParserK a m b
(<*>) = forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
    {-# INLINE (*>) #-}
    ParserK a m a
p1 *> :: forall a b. ParserK a m a -> ParserK a m b -> ParserK a m b
*> ParserK a m b
p2 = forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ \ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n Int
st Input a
arr ->
        let k1 :: ParseResult b -> Int -> Input a -> m (Step a m r)
k1 (Success Int
n1 b
_) Int
s Input a
input = forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m b
p2 ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n1 Int
s Input a
input
            k1 (Failure Int
n1 String
e) Int
s Input a
input = ParseResult b -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> String -> ParseResult b
Failure Int
n1 String
e) Int
s Input a
input
        in forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m a
p1 forall {b}. ParseResult b -> Int -> Input a -> m (Step a m r)
k1 Int
n Int
st Input a
arr
    {-# INLINE (<*) #-}
    ParserK a m a
p1 <* :: forall a b. ParserK a m a -> ParserK a m b -> ParserK a m a
<* ParserK a m b
p2 = forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ \ParseResult a -> Int -> Input a -> m (Step a m r)
k Int
n Int
st Input a
arr ->
        let k1 :: ParseResult a -> Int -> Input a -> m (Step a m r)
k1 (Success Int
n1 a
b) Int
s1 Input a
input =
                let k2 :: ParseResult b -> Int -> Input a -> m (Step a m r)
k2 (Success Int
n2 b
_) Int
s2 Input a
input2  = ParseResult a -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> b -> ParseResult b
Success Int
n2 a
b) Int
s2 Input a
input2
                    k2 (Failure Int
n2 String
e) Int
s2 Input a
input2  = ParseResult a -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> String -> ParseResult b
Failure Int
n2 String
e) Int
s2 Input a
input2
                in forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m b
p2 forall {b}. ParseResult b -> Int -> Input a -> m (Step a m r)
k2 Int
n1 Int
s1 Input a
input
            k1 (Failure Int
n1 String
e) Int
s1 Input a
input = ParseResult a -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> String -> ParseResult b
Failure Int
n1 String
e) Int
s1 Input a
input
        in forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m a
p1 ParseResult a -> Int -> Input a -> m (Step a m r)
k1 Int
n Int
st Input a
arr
    {-# INLINE liftA2 #-}
    liftA2 :: forall a b c.
(a -> b -> c) -> ParserK a m a -> ParserK a m b -> ParserK a m c
liftA2 a -> b -> c
f ParserK a m a
p = forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b -> c
f ParserK a m a
p)
{-# INLINE die #-}
die :: String -> ParserK a m b
die :: forall a (m :: * -> *) b. String -> ParserK a m b
die String
err = forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser (\ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n Int
st Input a
arr -> ParseResult b -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> String -> ParseResult b
Failure Int
n String
err) Int
st Input a
arr)
instance Monad m => Monad (ParserK a m) where
    {-# INLINE return #-}
    return :: forall a. a -> ParserK a m a
return = forall (f :: * -> *) a. Applicative f => a -> f a
pure
    {-# INLINE (>>=) #-}
    ParserK a m a
p >>= :: forall a b. ParserK a m a -> (a -> ParserK a m b) -> ParserK a m b
>>= a -> ParserK a m b
f = forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ \ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n Int
st Input a
arr ->
        let k1 :: ParseResult a -> Int -> Input a -> m (Step a m r)
k1 (Success Int
n1 a
b) Int
s1 Input a
inp = forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser (a -> ParserK a m b
f a
b) ParseResult b -> Int -> Input a -> m (Step a m r)
k Int
n1 Int
s1 Input a
inp
            k1 (Failure Int
n1 String
e) Int
s1 Input a
inp = ParseResult b -> Int -> Input a -> m (Step a m r)
k (forall b. Int -> String -> ParseResult b
Failure Int
n1 String
e) Int
s1 Input a
inp
         in forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m a
p ParseResult a -> Int -> Input a -> m (Step a m r)
k1 Int
n Int
st Input a
arr
    {-# INLINE (>>) #-}
    >> :: forall a b. ParserK a m a -> ParserK a m b -> ParserK a m b
(>>) = forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
#if !(MIN_VERSION_base(4,13,0))
    
    
    {-# INLINE fail #-}
    fail = die
#endif
instance Monad m => Fail.MonadFail (ParserK a m) where
    {-# INLINE fail #-}
    fail :: forall a. String -> ParserK a m a
fail = forall a (m :: * -> *) b. String -> ParserK a m b
die
instance MonadIO m => MonadIO (ParserK a m) where
    {-# INLINE liftIO #-}
    liftIO :: forall a. IO a -> ParserK a m a
liftIO = forall (m :: * -> *) b a. Monad m => m b -> ParserK a m b
fromEffect forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
instance Monad m => Alternative (ParserK a m) where
    {-# INLINE empty #-}
    empty :: forall a. ParserK a m a
empty = forall a (m :: * -> *) b. String -> ParserK a m b
die String
"empty"
    {-# INLINE (<|>) #-}
    ParserK a m a
p1 <|> :: forall a. ParserK a m a -> ParserK a m a -> ParserK a m a
<|> ParserK a m a
p2 = forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ \ParseResult a -> Int -> Input a -> m (Step a m r)
k Int
n Int
_ Input a
arr ->
        let
            k1 :: ParseResult a -> Int -> Input a -> m (Step a m r)
k1 (Failure Int
pos String
_) Int
used Input a
input = forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m a
p2 ParseResult a -> Int -> Input a -> m (Step a m r)
k (Int
pos forall a. Num a => a -> a -> a
- Int
used) Int
0 Input a
input
            k1 ParseResult a
success Int
_ Input a
input = ParseResult a -> Int -> Input a -> m (Step a m r)
k ParseResult a
success Int
0 Input a
input
        in forall a (m :: * -> *) b.
ParserK a m b
-> forall r.
   (ParseResult b -> Int -> Input a -> m (Step a m r))
   -> Int -> Int -> Input a -> m (Step a m r)
runParser ParserK a m a
p1 ParseResult a -> Int -> Input a -> m (Step a m r)
k1 Int
n Int
0 Input a
arr
    
    
    {-# INLINE many #-}
    many :: forall a. ParserK a m a -> ParserK a m [a]
many ParserK a m a
v = ParserK a m [a]
many_v
        where
        many_v :: ParserK a m [a]
many_v = ParserK a m [a]
some_v forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
        some_v :: ParserK a m [a]
some_v = (:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserK a m a
v forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserK a m [a]
many_v
    {-# INLINE some #-}
    some :: forall a. ParserK a m a -> ParserK a m [a]
some ParserK a m a
v = ParserK a m [a]
some_v
        where
        many_v :: ParserK a m [a]
many_v = ParserK a m [a]
some_v forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
        some_v :: ParserK a m [a]
some_v = (:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserK a m a
v forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserK a m [a]
many_v
instance Monad m => MonadPlus (ParserK a m) where
    {-# INLINE mzero #-}
    mzero :: forall a. ParserK a m a
mzero = forall a (m :: * -> *) b. String -> ParserK a m b
die String
"mzero"
    {-# INLINE mplus #-}
    mplus :: forall a. ParserK a m a -> ParserK a m a -> ParserK a m a
mplus = forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
{-# INLINE parseDToK #-}
parseDToK
    :: forall m a s b r. (Monad m, Unbox a)
    => (s -> a -> m (ParserD.Step s b))
    -> m (ParserD.Initial s b)
    -> (s -> m (ParserD.Step s b))
    -> (ParseResult b -> Int -> Input a -> m (Step a m r))
    -> Int
    -> Int
    -> Input a
    -> m (Step a m r)
parseDToK :: forall (m :: * -> *) a s b r.
(Monad m, Unbox a) =>
(s -> a -> m (Step s b))
-> m (Initial s b)
-> (s -> m (Step s b))
-> (ParseResult b -> Int -> Input a -> m (Step a m r))
-> Int
-> Int
-> Input a
-> m (Step a m r)
parseDToK s -> a -> m (Step s b)
pstep m (Initial s b)
initial s -> m (Step s b)
extract ParseResult b -> Int -> Input a -> m (Step a m r)
cont !Int
offset0 !Int
usedCount !Input a
input = do
    Initial s b
res <- m (Initial s b)
initial
    case Initial s b
res of
        ParserD.IPartial s
pst -> do
            case Input a
input of
                Chunk Array a
arr -> Int -> Int -> s -> Array a -> m (Step a m r)
parseContChunk Int
usedCount Int
offset0 s
pst Array a
arr
                Input a
None -> Int -> s -> m (Step a m r)
parseContNothing Int
usedCount s
pst
        ParserD.IDone b
b -> ParseResult b -> Int -> Input a -> m (Step a m r)
cont (forall b. Int -> b -> ParseResult b
Success Int
offset0 b
b) Int
usedCount Input a
input
        ParserD.IError String
err -> ParseResult b -> Int -> Input a -> m (Step a m r)
cont (forall b. Int -> String -> ParseResult b
Failure Int
offset0 String
err) Int
usedCount Input a
input
    where
    
    
    {-# NOINLINE parseContChunk #-}
    parseContChunk :: Int -> Int -> s -> Array a -> m (Step a m r)
parseContChunk !Int
count !Int
offset !s
state arr :: Array a
arr@(Array MutableByteArray
contents Int
start Int
end) = do
         if Int
offset forall a. Ord a => a -> a -> Bool
>= Int
0
         then SPEC -> Int -> s -> m (Step a m r)
go SPEC
SPEC (Int
start forall a. Num a => a -> a -> a
+ Int
offset forall a. Num a => a -> a -> a
* SIZE_OF(a)) state
         else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *) r.
Int -> (Input a -> m (Step a m r)) -> Step a m r
Continue Int
offset (Int -> s -> Input a -> m (Step a m r)
parseCont Int
count s
state)
        where
        {-# INLINE onDone #-}
        onDone :: Int -> b -> m (Step a m r)
onDone Int
n b
b =
            forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall a. Unbox a => Array a -> Int
Array.length Array a
arr)
                (ParseResult b -> Int -> Input a -> m (Step a m r)
cont (forall b. Int -> b -> ParseResult b
Success Int
n b
b) (Int
count forall a. Num a => a -> a -> a
+ Int
n forall a. Num a => a -> a -> a
- Int
offset) (forall a. Array a -> Input a
Chunk Array a
arr))
        {-# INLINE callParseCont #-}
        callParseCont :: (Int -> (Input a -> m (Step a m r)) -> a) -> Int -> s -> m a
callParseCont Int -> (Input a -> m (Step a m r)) -> a
constr Int
n s
pst1 =
            forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
>= forall a. Unbox a => Array a -> Int
Array.length Array a
arr)
                (forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> (Input a -> m (Step a m r)) -> a
constr Int
n (Int -> s -> Input a -> m (Step a m r)
parseCont (Int
count forall a. Num a => a -> a -> a
+ Int
n forall a. Num a => a -> a -> a
- Int
offset) s
pst1))
        {-# INLINE onPartial #-}
        onPartial :: Int -> s -> m (Step a m r)
onPartial = forall {m :: * -> *} {a}.
Monad m =>
(Int -> (Input a -> m (Step a m r)) -> a) -> Int -> s -> m a
callParseCont forall a (m :: * -> *) r.
Int -> (Input a -> m (Step a m r)) -> Step a m r
Partial
        {-# INLINE onContinue #-}
        onContinue :: Int -> s -> m (Step a m r)
onContinue = forall {m :: * -> *} {a}.
Monad m =>
(Int -> (Input a -> m (Step a m r)) -> a) -> Int -> s -> m a
callParseCont forall a (m :: * -> *) r.
Int -> (Input a -> m (Step a m r)) -> Step a m r
Continue
        {-# INLINE onError #-}
        onError :: Int -> String -> m (Step a m r)
onError Int
n String
err =
            ParseResult b -> Int -> Input a -> m (Step a m r)
cont (forall b. Int -> String -> ParseResult b
Failure Int
n String
err) (Int
count forall a. Num a => a -> a -> a
+ Int
n forall a. Num a => a -> a -> a
- Int
offset) (forall a. Array a -> Input a
Chunk Array a
arr)
        {-# INLINE onBack #-}
        onBack :: Int -> Int -> (Int -> s -> m (Step a m r)) -> s -> m (Step a m r)
onBack Int
offset1 Int
elemSize Int -> s -> m (Step a m r)
constr s
pst = do
            let pos :: Int
pos = Int
offset1 forall a. Num a => a -> a -> a
- Int
start
             in if Int
pos forall a. Ord a => a -> a -> Bool
>= Int
0
                then SPEC -> Int -> s -> m (Step a m r)
go SPEC
SPEC Int
offset1 s
pst
                else Int -> s -> m (Step a m r)
constr (Int
pos forall a. Integral a => a -> a -> a
`div` Int
elemSize) s
pst
        
        
        
        
        go :: SPEC -> Int -> s -> m (Step a m r)
go !SPEC
_ !Int
cur !s
pst | Int
cur forall a. Ord a => a -> a -> Bool
>= Int
end =
            Int -> s -> m (Step a m r)
onContinue ((Int
end forall a. Num a => a -> a -> a
- Int
start) forall a. Integral a => a -> a -> a
`div` SIZE_OF(a))  pst
        go !SPEC
_ !Int
cur !s
pst = do
            let !x :: a
x = forall a. IO a -> a
unsafeInlineIO forall a b. (a -> b) -> a -> b
$ forall a. Unbox a => MutableByteArray -> Int -> IO a
peekWith MutableByteArray
contents Int
cur
            Step s b
pRes <- s -> a -> m (Step s b)
pstep s
pst a
x
            let elemSize :: Int
elemSize = SIZE_OF(a)
                next :: Int
next = INDEX_NEXT(cur,a)
                back :: Int -> Int
back Int
n = Int
next forall a. Num a => a -> a -> a
- Int
n forall a. Num a => a -> a -> a
* Int
elemSize
                curOff :: Int
curOff = (Int
cur forall a. Num a => a -> a -> a
- Int
start) forall a. Integral a => a -> a -> a
`div` Int
elemSize
                nextOff :: Int
nextOff = (Int
next forall a. Num a => a -> a -> a
- Int
start) forall a. Integral a => a -> a -> a
`div` Int
elemSize
            
            
            case Step s b
pRes of
                ParserD.Done Int
0 b
b ->
                    Int -> b -> m (Step a m r)
onDone Int
nextOff b
b
                ParserD.Done Int
1 b
b ->
                    Int -> b -> m (Step a m r)
onDone Int
curOff b
b
                ParserD.Done Int
n b
b ->
                    Int -> b -> m (Step a m r)
onDone ((Int -> Int
back Int
n forall a. Num a => a -> a -> a
- Int
start) forall a. Integral a => a -> a -> a
`div` Int
elemSize) b
b
                ParserD.Partial Int
0 s
pst1 ->
                    SPEC -> Int -> s -> m (Step a m r)
go SPEC
SPEC Int
next s
pst1
                ParserD.Partial Int
1 s
pst1 ->
                    SPEC -> Int -> s -> m (Step a m r)
go SPEC
SPEC Int
cur s
pst1
                ParserD.Partial Int
n s
pst1 ->
                    Int -> Int -> (Int -> s -> m (Step a m r)) -> s -> m (Step a m r)
onBack (Int -> Int
back Int
n) Int
elemSize Int -> s -> m (Step a m r)
onPartial s
pst1
                ParserD.Continue Int
0 s
pst1 ->
                    SPEC -> Int -> s -> m (Step a m r)
go SPEC
SPEC Int
next s
pst1
                ParserD.Continue Int
1 s
pst1 ->
                    SPEC -> Int -> s -> m (Step a m r)
go SPEC
SPEC Int
cur s
pst1
                ParserD.Continue Int
n s
pst1 ->
                    Int -> Int -> (Int -> s -> m (Step a m r)) -> s -> m (Step a m r)
onBack (Int -> Int
back Int
n) Int
elemSize Int -> s -> m (Step a m r)
onContinue s
pst1
                ParserD.Error String
err ->
                    Int -> String -> m (Step a m r)
onError Int
curOff String
err
    {-# NOINLINE parseContNothing #-}
    parseContNothing :: Int -> s -> m (Step a m r)
parseContNothing !Int
count !s
pst = do
        Step s b
r <- s -> m (Step s b)
extract s
pst
        case Step s b
r of
            
            
            
            ParserD.Done Int
n b
b ->
                forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
>= Int
0)
                    (ParseResult b -> Int -> Input a -> m (Step a m r)
cont (forall b. Int -> b -> ParseResult b
Success (- Int
n) b
b) (Int
count forall a. Num a => a -> a -> a
- Int
n) forall a. Input a
None)
            ParserD.Continue Int
n s
pst1 ->
                forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
>= Int
0)
                    (forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *) r.
Int -> (Input a -> m (Step a m r)) -> Step a m r
Continue (- Int
n) (Int -> s -> Input a -> m (Step a m r)
parseCont (Int
count forall a. Num a => a -> a -> a
- Int
n) s
pst1))
            ParserD.Error String
err ->
                
                
                ParseResult b -> Int -> Input a -> m (Step a m r)
cont (forall b. Int -> String -> ParseResult b
Failure Int
0 String
err) Int
count forall a. Input a
None
            ParserD.Partial Int
_ s
_ -> forall a. (?callStack::CallStack) => String -> a
error String
"Bug: parseDToK Partial unreachable"
    
    
    
    {-# INLINE parseCont #-}
    parseCont :: Int -> s -> Input a -> m (Step a m r)
parseCont !Int
cnt !s
pst (Chunk Array a
arr) = Int -> Int -> s -> Array a -> m (Step a m r)
parseContChunk Int
cnt Int
0 s
pst Array a
arr
    parseCont !Int
cnt !s
pst Input a
None = Int -> s -> m (Step a m r)
parseContNothing Int
cnt s
pst
{-# INLINE_LATE fromParser #-}
fromParser :: (Monad m, Unbox a) => ParserD.Parser a m b -> ParserK a m b
fromParser :: forall (m :: * -> *) a b.
(Monad m, Unbox a) =>
Parser a m b -> ParserK a m b
fromParser (ParserD.Parser s -> a -> m (Step s b)
step m (Initial s b)
initial s -> m (Step s b)
extract) =
    forall a (m :: * -> *) b.
(forall r.
 (ParseResult b -> Int -> Input a -> m (Step a m r))
 -> Int -> Int -> Input a -> m (Step a m r))
-> ParserK a m b
MkParser forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a s b r.
(Monad m, Unbox a) =>
(s -> a -> m (Step s b))
-> m (Initial s b)
-> (s -> m (Step s b))
-> (ParseResult b -> Int -> Input a -> m (Step a m r))
-> Int
-> Int
-> Input a
-> m (Step a m r)
parseDToK s -> a -> m (Step s b)
step m (Initial s b)
initial s -> m (Step s b)
extract