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