-- | https://github.com/AndrasKovacs/flatparse/pull/56
module Raehik.Compat.FlatParse.Basic.WithLength where

import FlatParse.Basic.Parser
import GHC.Exts

-- | Run a parser, and return the result as well as the number of bytes it
--   consumed.
parseWithLength :: ParserT st e a -> ParserT st e (a, Int)
parseWithLength :: forall (st :: ZeroBitType) e a.
ParserT st e a -> ParserT st e (a, Int)
parseWithLength (ParserT ForeignPtrContents -> Addr# -> Addr# -> st -> Res# st e a
f) = (ForeignPtrContents -> Addr# -> Addr# -> st -> Res# st e (a, Int))
-> ParserT st e (a, Int)
forall (st :: ZeroBitType) e a.
(ForeignPtrContents -> Addr# -> Addr# -> st -> Res# st e a)
-> ParserT st e a
ParserT ((ForeignPtrContents -> Addr# -> Addr# -> st -> Res# st e (a, Int))
 -> ParserT st e (a, Int))
-> (ForeignPtrContents
    -> Addr# -> Addr# -> st -> Res# st e (a, Int))
-> ParserT st e (a, Int)
forall a b. (a -> b) -> a -> b
$ \ForeignPtrContents
fp Addr#
eob Addr#
s st
st -> do
    case ForeignPtrContents -> Addr# -> Addr# -> st -> Res# st e a
f ForeignPtrContents
fp Addr#
eob Addr#
s st
st of
      Fail# st
st'      -> st -> Res# st e (a, Int)
forall (st :: ZeroBitType) e a. st -> Res# st e a
Fail# st
st'
      Err#  st
st' e
e    -> st -> e -> Res# st e (a, Int)
forall (st :: ZeroBitType) e a. st -> e -> Res# st e a
Err#  st
st' e
e
      OK#   st
st' a
a Addr#
s' -> st -> (a, Int) -> Addr# -> Res# st e (a, Int)
forall (st :: ZeroBitType) a e. st -> a -> Addr# -> Res# st e a
OK#   st
st' (a
a, Int# -> Int
I# (Addr#
s' Addr# -> Addr# -> Int#
`minusAddr#` Addr#
s)) Addr#
s'
{-# inline parseWithLength #-}