{-# LANGUAGE Rank2Types #-}
-- | Parsers for use with 'ByteStream's.
module Bio.Streaming.Parse
    ( Parser
    , ParseError(..)
    , EofException(..)
    , parse
    , parseIO
    , parseLog
    , parseM
    , abortParse
    , isFinished
    , drop
    , dropLine
    , getByte
    , getString
    , getWord32
    , getWord64
    , isolate
    , atto
    ) where

import Bio.Prelude                       hiding ( drop )
import Bio.Streaming.Bytes                      ( ByteStream )

import qualified Bio.Streaming.Bytes            as S
import qualified Data.Attoparsec.ByteString     as A
import qualified Data.ByteString                as B
import qualified Streaming.Prelude              as Q

newtype Parser r m a = P {
    Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP :: forall x .
            (a -> ByteStream m r -> m x)                -- successful parse
         -> (r -> m x)                                  -- end of input stream
         -> (SomeException -> ByteStream m r -> m x)    -- exception and remaining input
         -> ByteStream m r -> m x }                     -- input, result

instance Functor (Parser r m) where
    fmap :: (a -> b) -> Parser r m a -> Parser r m b
fmap f :: a -> b
f p :: Parser r m a
p = (forall x.
 (b -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m b
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (b -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m b)
-> (forall x.
    (b -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m b
forall a b. (a -> b) -> a -> b
$ \sk :: b -> ByteStream m r -> m x
sk -> Parser r m a
-> (a -> ByteStream m r -> m x)
-> (r -> m x)
-> (SomeException -> ByteStream m r -> m x)
-> ByteStream m r
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP Parser r m a
p (b -> ByteStream m r -> m x
sk (b -> ByteStream m r -> m x)
-> (a -> b) -> a -> ByteStream m r -> m x
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> b
f)

instance Applicative (Parser r m) where
    pure :: a -> Parser r m a
pure a :: a
a = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \sk :: a -> ByteStream m r -> m x
sk _rk :: r -> m x
_rk _ek :: SomeException -> ByteStream m r -> m x
_ek -> a -> ByteStream m r -> m x
sk a
a
    a :: Parser r m (a -> b)
a <*> :: Parser r m (a -> b) -> Parser r m a -> Parser r m b
<*> b :: Parser r m a
b = (forall x.
 (b -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m b
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (b -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m b)
-> (forall x.
    (b -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m b
forall a b. (a -> b) -> a -> b
$ \sk :: b -> ByteStream m r -> m x
sk rk :: r -> m x
rk ek :: SomeException -> ByteStream m r -> m x
ek -> Parser r m (a -> b)
-> ((a -> b) -> ByteStream m r -> m x)
-> (r -> m x)
-> (SomeException -> ByteStream m r -> m x)
-> ByteStream m r
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP Parser r m (a -> b)
a (\f :: a -> b
f -> Parser r m a
-> (a -> ByteStream m r -> m x)
-> (r -> m x)
-> (SomeException -> ByteStream m r -> m x)
-> ByteStream m r
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP Parser r m a
b (\x :: a
x -> b -> ByteStream m r -> m x
sk (a -> b
f a
x)) r -> m x
rk SomeException -> ByteStream m r -> m x
ek) r -> m x
rk SomeException -> ByteStream m r -> m x
ek

instance Monad (Parser r m) where
    return :: a -> Parser r m a
return = a -> Parser r m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    m :: Parser r m a
m >>= :: Parser r m a -> (a -> Parser r m b) -> Parser r m b
>>= k :: a -> Parser r m b
k = (forall x.
 (b -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m b
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (b -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m b)
-> (forall x.
    (b -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m b
forall a b. (a -> b) -> a -> b
$ \sk :: b -> ByteStream m r -> m x
sk rk :: r -> m x
rk ek :: SomeException -> ByteStream m r -> m x
ek -> Parser r m a
-> (a -> ByteStream m r -> m x)
-> (r -> m x)
-> (SomeException -> ByteStream m r -> m x)
-> ByteStream m r
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP Parser r m a
m (\a :: a
a -> Parser r m b
-> (b -> ByteStream m r -> m x)
-> (r -> m x)
-> (SomeException -> ByteStream m r -> m x)
-> ByteStream m r
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP (a -> Parser r m b
k a
a) b -> ByteStream m r -> m x
sk r -> m x
rk SomeException -> ByteStream m r -> m x
ek) r -> m x
rk SomeException -> ByteStream m r -> m x
ek

instance MonadIO m => MonadIO (Parser r m) where
    liftIO :: IO a -> Parser r m a
liftIO m :: IO a
m = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \sk :: a -> ByteStream m r -> m x
sk _rk :: r -> m x
_rk _ek :: SomeException -> ByteStream m r -> m x
_ek s :: ByteStream m r
s -> IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO a
m m a -> (a -> m x) -> m x
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a :: a
a -> a -> ByteStream m r -> m x
sk a
a ByteStream m r
s

instance MonadTrans (Parser r) where
    lift :: m a -> Parser r m a
lift m :: m a
m = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \sk :: a -> ByteStream m r -> m x
sk _rk :: r -> m x
_rk _ek :: SomeException -> ByteStream m r -> m x
_ek s :: ByteStream m r
s -> m a
m m a -> (a -> m x) -> m x
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a :: a
a -> a -> ByteStream m r -> m x
sk a
a ByteStream m r
s

instance MonadThrow (Parser r m) where
    throwM :: e -> Parser r m a
throwM e :: e
e = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \_sk :: a -> ByteStream m r -> m x
_sk _rk :: r -> m x
_rk ek :: SomeException -> ByteStream m r -> m x
ek -> SomeException -> ByteStream m r -> m x
ek (e -> SomeException
forall e. Exception e => e -> SomeException
toException e
e)

modify :: (ByteStream m r -> ByteStream m r) -> Parser r m ()
modify :: (ByteStream m r -> ByteStream m r) -> Parser r m ()
modify f :: ByteStream m r -> ByteStream m r
f = (forall x.
 (() -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m ()
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (() -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m ())
-> (forall x.
    (() -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m ()
forall a b. (a -> b) -> a -> b
$ \sk :: () -> ByteStream m r -> m x
sk _rk :: r -> m x
_rk _ek :: SomeException -> ByteStream m r -> m x
_ek -> () -> ByteStream m r -> m x
sk () (ByteStream m r -> m x)
-> (ByteStream m r -> ByteStream m r) -> ByteStream m r -> m x
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteStream m r -> ByteStream m r
f

parse :: Monad m => (Int64 -> Parser r m a) -> ByteStream m r
      -> m (Either (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
parse :: (Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
parse p :: Int64 -> Parser r m a
p = ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
go
  where
    go :: ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
go    (S.Empty     r :: r
r)             = Either
  (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall a b. (a -> b) -> a -> b
$ Either r (a, ByteStream m r)
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
forall a b. b -> Either a b
Right (Either r (a, ByteStream m r)
 -> Either
      (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
-> Either r (a, ByteStream m r)
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
forall a b. (a -> b) -> a -> b
$ r -> Either r (a, ByteStream m r)
forall a b. a -> Either a b
Left r
r
    go    (S.Go        k :: m (ByteStream m r)
k)             = m (ByteStream m r)
k m (ByteStream m r)
-> (ByteStream m r
    -> m (Either
            (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
go
    go ck :: ByteStream m r
ck@(S.Chunk c :: Bytes
c o :: Int64
o s :: ByteStream m r
s) | Bytes -> Bool
B.null  Bytes
c = ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
go ByteStream m r
s
                          | Bool
otherwise = Parser r m a
-> (a
    -> ByteStream m r
    -> m (Either
            (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> (r
    -> m (Either
            (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> (SomeException
    -> ByteStream m r
    -> m (Either
            (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP (Int64 -> Parser r m a
p Int64
o) (\a :: a
a t :: ByteStream m r
t -> Either
  (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> (Either r (a, ByteStream m r)
    -> Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
-> Either r (a, ByteStream m r)
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Either r (a, ByteStream m r)
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
forall a b. b -> Either a b
Right (Either r (a, ByteStream m r)
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> Either r (a, ByteStream m r)
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall a b. (a -> b) -> a -> b
$ (a, ByteStream m r) -> Either r (a, ByteStream m r)
forall a b. b -> Either a b
Right (a
a,ByteStream m r
t))
                                                   (Either
  (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> (r
    -> Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
-> r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Either r (a, ByteStream m r)
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
forall a b. b -> Either a b
Right (Either r (a, ByteStream m r)
 -> Either
      (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
-> (r -> Either r (a, ByteStream m r))
-> r
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. r -> Either r (a, ByteStream m r)
forall a b. a -> Either a b
Left)
                                                   (((SomeException, ByteStream m r)
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> SomeException
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall a b c. ((a, b) -> c) -> a -> b -> c
curry (((SomeException, ByteStream m r)
  -> m (Either
          (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
 -> SomeException
 -> ByteStream m r
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> ((SomeException, ByteStream m r)
    -> m (Either
            (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> SomeException
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall a b. (a -> b) -> a -> b
$ Either
  (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> ((SomeException, ByteStream m r)
    -> Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
-> (SomeException, ByteStream m r)
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (SomeException, ByteStream m r)
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
forall a b. a -> Either a b
Left)
                                                   ByteStream m r
ck

parseIO :: MonadIO m => (Int64 -> Parser r m a) -> ByteStream m r -> m (Either r (a, ByteStream m r))
parseIO :: (Int64 -> Parser r m a)
-> ByteStream m r -> m (Either r (a, ByteStream m r))
parseIO p :: Int64 -> Parser r m a
p = (Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) r a.
Monad m =>
(Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
parse Int64 -> Parser r m a
p (ByteStream m r
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> (Either
      (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
    -> m (Either r (a, ByteStream m r)))
-> ByteStream m r
-> m (Either r (a, ByteStream m r))
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> ((SomeException, ByteStream m r)
 -> m (Either r (a, ByteStream m r)))
-> (Either r (a, ByteStream m r)
    -> m (Either r (a, ByteStream m r)))
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either r (a, ByteStream m r))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (IO (Either r (a, ByteStream m r))
-> m (Either r (a, ByteStream m r))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either r (a, ByteStream m r))
 -> m (Either r (a, ByteStream m r)))
-> ((SomeException, ByteStream m r)
    -> IO (Either r (a, ByteStream m r)))
-> (SomeException, ByteStream m r)
-> m (Either r (a, ByteStream m r))
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. SomeException -> IO (Either r (a, ByteStream m r))
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (SomeException -> IO (Either r (a, ByteStream m r)))
-> ((SomeException, ByteStream m r) -> SomeException)
-> (SomeException, ByteStream m r)
-> IO (Either r (a, ByteStream m r))
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (SomeException, ByteStream m r) -> SomeException
forall a b. (a, b) -> a
fst) Either r (a, ByteStream m r) -> m (Either r (a, ByteStream m r))
forall (m :: * -> *) a. Monad m => a -> m a
return

parseLog :: MonadLog m => Level -> (Int64 -> Parser r m a) -> ByteStream m r -> m (Either r (a, ByteStream m r))
parseLog :: Level
-> (Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either r (a, ByteStream m r))
parseLog lv :: Level
lv p :: Int64 -> Parser r m a
p = (Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) r a.
Monad m =>
(Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
parse Int64 -> Parser r m a
p (ByteStream m r
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> (Either
      (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
    -> m (Either r (a, ByteStream m r)))
-> ByteStream m r
-> m (Either r (a, ByteStream m r))
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> ((SomeException, ByteStream m r)
 -> m (Either r (a, ByteStream m r)))
-> (Either r (a, ByteStream m r)
    -> m (Either r (a, ByteStream m r)))
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either r (a, ByteStream m r))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (SomeException, ByteStream m r) -> m (Either r (a, ByteStream m r))
forall (m :: * -> *) e a b.
(MonadLog m, Exception e) =>
(e, ByteStream m a) -> m (Either a b)
throw_it Either r (a, ByteStream m r) -> m (Either r (a, ByteStream m r))
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  where throw_it :: (e, ByteStream m a) -> m (Either a b)
throw_it (ex :: e
ex,rest :: ByteStream m a
rest) = Level -> e -> m ()
forall (m :: * -> *) e.
(MonadLog m, Exception e) =>
Level -> e -> m ()
logMsg Level
lv e
ex m () -> m (Either a b) -> m (Either a b)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> Either a b
forall a b. a -> Either a b
Left (a -> Either a b) -> m a -> m (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteStream m a -> m a
forall (m :: * -> *) r. Monad m => ByteStream m r -> m r
S.effects ByteStream m a
rest

parseM :: MonadThrow m => (Int64 -> Parser r m a) -> ByteStream m r -> m (Either r (a, ByteStream m r))
parseM :: (Int64 -> Parser r m a)
-> ByteStream m r -> m (Either r (a, ByteStream m r))
parseM p :: Int64 -> Parser r m a
p = (Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
forall (m :: * -> *) r a.
Monad m =>
(Int64 -> Parser r m a)
-> ByteStream m r
-> m (Either
        (SomeException, ByteStream m r) (Either r (a, ByteStream m r)))
parse Int64 -> Parser r m a
p (ByteStream m r
 -> m (Either
         (SomeException, ByteStream m r) (Either r (a, ByteStream m r))))
-> (Either
      (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
    -> m (Either r (a, ByteStream m r)))
-> ByteStream m r
-> m (Either r (a, ByteStream m r))
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> ((SomeException, ByteStream m r)
 -> m (Either r (a, ByteStream m r)))
-> (Either r (a, ByteStream m r)
    -> m (Either r (a, ByteStream m r)))
-> Either
     (SomeException, ByteStream m r) (Either r (a, ByteStream m r))
-> m (Either r (a, ByteStream m r))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (SomeException -> m (Either r (a, ByteStream m r))
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (SomeException -> m (Either r (a, ByteStream m r)))
-> ((SomeException, ByteStream m r) -> SomeException)
-> (SomeException, ByteStream m r)
-> m (Either r (a, ByteStream m r))
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (SomeException, ByteStream m r) -> SomeException
forall a b. (a, b) -> a
fst) Either r (a, ByteStream m r) -> m (Either r (a, ByteStream m r))
forall (m :: * -> *) a. Monad m => a -> m a
return

abortParse :: Monad m => Parser r m a
abortParse :: Parser r m a
abortParse = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \_sk :: a -> ByteStream m r -> m x
_sk rk :: r -> m x
rk _ek :: SomeException -> ByteStream m r -> m x
_ek -> ByteStream m r -> m r
forall (m :: * -> *) r. Monad m => ByteStream m r -> m r
S.effects (ByteStream m r -> m r) -> (r -> m x) -> ByteStream m r -> m x
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> r -> m x
rk

liftFun :: Monad m => (ByteStream m r -> m (a, ByteStream m r)) -> Parser r m a
liftFun :: (ByteStream m r -> m (a, ByteStream m r)) -> Parser r m a
liftFun f :: ByteStream m r -> m (a, ByteStream m r)
f = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \sk :: a -> ByteStream m r -> m x
sk _rk :: r -> m x
_rk _ek :: SomeException -> ByteStream m r -> m x
_ek -> ByteStream m r -> m (a, ByteStream m r)
f (ByteStream m r -> m (a, ByteStream m r))
-> ((a, ByteStream m r) -> m x) -> ByteStream m r -> m x
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> (a -> ByteStream m r -> m x) -> (a, ByteStream m r) -> m x
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> ByteStream m r -> m x
sk

isFinished :: Monad m => Parser r m Bool
isFinished :: Parser r m Bool
isFinished = (ByteStream m r -> m (Bool, ByteStream m r)) -> Parser r m Bool
forall (m :: * -> *) r a.
Monad m =>
(ByteStream m r -> m (a, ByteStream m r)) -> Parser r m a
liftFun ByteStream m r -> m (Bool, ByteStream m r)
forall (m :: * -> *) r.
Monad m =>
ByteStream m r -> m (Bool, ByteStream m r)
go
  where
    go :: ByteStream m r -> m (Bool, ByteStream m r)
go    (S.Empty     r :: r
r)             = (Bool, ByteStream m r) -> m (Bool, ByteStream m r)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
True, r -> ByteStream m r
forall (m :: * -> *) r. r -> ByteStream m r
S.Empty r
r)
    go    (S.Go        k :: m (ByteStream m r)
k)             = m (ByteStream m r)
k m (ByteStream m r)
-> (ByteStream m r -> m (Bool, ByteStream m r))
-> m (Bool, ByteStream m r)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteStream m r -> m (Bool, ByteStream m r)
go
    go ck :: ByteStream m r
ck@(S.Chunk c :: Bytes
c _ s :: ByteStream m r
s) | Bytes -> Bool
B.null  Bytes
c = ByteStream m r -> m (Bool, ByteStream m r)
go ByteStream m r
s
                          | Bool
otherwise = (Bool, ByteStream m r) -> m (Bool, ByteStream m r)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
False, ByteStream m r
ck)

drop :: Monad m => Int -> Parser r m ()
drop :: Int -> Parser r m ()
drop l :: Int
l = (ByteStream m r -> ByteStream m r) -> Parser r m ()
forall (m :: * -> *) r.
(ByteStream m r -> ByteStream m r) -> Parser r m ()
modify ((ByteStream m r -> ByteStream m r) -> Parser r m ())
-> (ByteStream m r -> ByteStream m r) -> Parser r m ()
forall a b. (a -> b) -> a -> b
$ Int64 -> ByteStream m r -> ByteStream m r
forall (m :: * -> *) r.
Monad m =>
Int64 -> ByteStream m r -> ByteStream m r
S.drop (Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
l)

dropLine :: Monad m => Parser r m ()
dropLine :: Parser r m ()
dropLine = (ByteStream m r -> ByteStream m r) -> Parser r m ()
forall (m :: * -> *) r.
(ByteStream m r -> ByteStream m r) -> Parser r m ()
modify ((ByteStream m r -> ByteStream m r) -> Parser r m ())
-> (ByteStream m r -> ByteStream m r) -> Parser r m ()
forall a b. (a -> b) -> a -> b
$ Int64 -> ByteStream m r -> ByteStream m r
forall (m :: * -> *) r.
Monad m =>
Int64 -> ByteStream m r -> ByteStream m r
S.drop 1 (ByteStream m r -> ByteStream m r)
-> (ByteStream m r -> ByteStream m r)
-> ByteStream m r
-> ByteStream m r
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Word8 -> Bool) -> ByteStream m r -> ByteStream m r
forall (m :: * -> *) r.
Monad m =>
(Word8 -> Bool) -> ByteStream m r -> ByteStream m r
S.dropWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= 10)

getByte :: Monad m => Parser r m Word8
getByte :: Parser r m Word8
getByte = (forall x.
 (Word8 -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m Word8
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (Word8 -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m Word8)
-> (forall x.
    (Word8 -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m Word8
forall a b. (a -> b) -> a -> b
$ \sk :: Word8 -> ByteStream m r -> m x
sk _rk :: r -> m x
_rk ek :: SomeException -> ByteStream m r -> m x
ek -> ByteStream m r -> m (Either r (Word8, ByteStream m r))
forall (m :: * -> *) r.
Monad m =>
ByteStream m r -> m (Either r (Word8, ByteStream m r))
S.nextByte (ByteStream m r -> m (Either r (Word8, ByteStream m r)))
-> (Either r (Word8, ByteStream m r) -> m x)
-> ByteStream m r
-> m x
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> (r -> m x)
-> ((Word8, ByteStream m r) -> m x)
-> Either r (Word8, ByteStream m r)
-> m x
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (SomeException -> ByteStream m r -> m x
ek (EofException -> SomeException
forall e. Exception e => e -> SomeException
toException EofException
EofException) (ByteStream m r -> m x) -> (r -> ByteStream m r) -> r -> m x
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. r -> ByteStream m r
forall (f :: * -> *) a. Applicative f => a -> f a
pure) ((Word8 -> ByteStream m r -> m x) -> (Word8, ByteStream m r) -> m x
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Word8 -> ByteStream m r -> m x
sk)

getString :: Monad m => Int -> Parser r m B.ByteString
getString :: Int -> Parser r m Bytes
getString l :: Int
l = (ByteStream m r -> m (Bytes, ByteStream m r)) -> Parser r m Bytes
forall (m :: * -> *) r a.
Monad m =>
(ByteStream m r -> m (a, ByteStream m r)) -> Parser r m a
liftFun ((ByteStream m r -> m (Bytes, ByteStream m r)) -> Parser r m Bytes)
-> (ByteStream m r -> m (Bytes, ByteStream m r))
-> Parser r m Bytes
forall a b. (a -> b) -> a -> b
$ (Of Bytes (ByteStream m r) -> (Bytes, ByteStream m r))
-> m (Of Bytes (ByteStream m r)) -> m (Bytes, ByteStream m r)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Of Bytes (ByteStream m r) -> (Bytes, ByteStream m r)
forall a b. Of a b -> (a, b)
Q.lazily (m (Of Bytes (ByteStream m r)) -> m (Bytes, ByteStream m r))
-> (ByteStream m r -> m (Of Bytes (ByteStream m r)))
-> ByteStream m r
-> m (Bytes, ByteStream m r)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> ByteStream m r -> m (Of Bytes (ByteStream m r))
forall (m :: * -> *) r.
Monad m =>
Int -> ByteStream m r -> m (Of Bytes (ByteStream m r))
S.splitAt' Int
l

getWord32 :: Monad m => Parser r m Word32
getWord32 :: Parser r m Word32
getWord32 = (Bytes -> Word32) -> Parser r m Bytes -> Parser r m Word32
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((Word32, Int) -> Word32
forall a b. (a, b) -> a
fst ((Word32, Int) -> Word32)
-> (Bytes -> (Word32, Int)) -> Bytes -> Word32
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ((Word32, Int) -> Word8 -> (Word32, Int))
-> (Word32, Int) -> Bytes -> (Word32, Int)
forall a. (a -> Word8 -> a) -> a -> Bytes -> a
B.foldl (\(a :: Word32
a,i :: Int
i) w :: Word8
w -> (Word32
a Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
shiftL (Word8 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
w) Int
i, Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 8)) (0,0)) (Int -> Parser r m Bytes
forall (m :: * -> *) r. Monad m => Int -> Parser r m Bytes
getString 4)

getWord64 :: Monad m => Parser r m Word64
getWord64 :: Parser r m Word64
getWord64 = (Bytes -> Word64) -> Parser r m Bytes -> Parser r m Word64
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((Word64, Int) -> Word64
forall a b. (a, b) -> a
fst ((Word64, Int) -> Word64)
-> (Bytes -> (Word64, Int)) -> Bytes -> Word64
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ((Word64, Int) -> Word8 -> (Word64, Int))
-> (Word64, Int) -> Bytes -> (Word64, Int)
forall a. (a -> Word8 -> a) -> a -> Bytes -> a
B.foldl (\(a :: Word64
a,i :: Int
i) w :: Word8
w -> (Word64
a Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
shiftL (Word8 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
w) Int
i, Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 8)) (0,0)) (Int -> Parser r m Bytes
forall (m :: * -> *) r. Monad m => Int -> Parser r m Bytes
getString 8)

isolate :: Monad m => Int -> Parser (ByteStream m r) m a -> Parser r m a
isolate :: Int -> Parser (ByteStream m r) m a -> Parser r m a
isolate l :: Int
l p :: Parser (ByteStream m r) m a
p = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \sk :: a -> ByteStream m r -> m x
sk rk :: r -> m x
rk ek :: SomeException -> ByteStream m r -> m x
ek -> Parser (ByteStream m r) m a
-> (a -> ByteStream m (ByteStream m r) -> m x)
-> (ByteStream m r -> m x)
-> (SomeException -> ByteStream m (ByteStream m r) -> m x)
-> ByteStream m (ByteStream m r)
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP Parser (ByteStream m r) m a
p (\a :: a
a -> ByteStream m (ByteStream m r) -> m (ByteStream m r)
forall (m :: * -> *) r. Monad m => ByteStream m r -> m r
S.effects (ByteStream m (ByteStream m r) -> m (ByteStream m r))
-> (ByteStream m r -> m x) -> ByteStream m (ByteStream m r) -> m x
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> a -> ByteStream m r -> m x
sk a
a)
                                      (ByteStream m r -> m r
forall (m :: * -> *) r. Monad m => ByteStream m r -> m r
S.effects (ByteStream m r -> m r) -> (r -> m x) -> ByteStream m r -> m x
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> r -> m x
rk)
                                      (\e :: SomeException
e rest :: ByteStream m (ByteStream m r)
rest -> SomeException -> ByteStream m r -> m x
ek SomeException
e (ByteStream m (ByteStream m r) -> ByteStream m r
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join ByteStream m (ByteStream m r)
rest)) (ByteStream m (ByteStream m r) -> m x)
-> (ByteStream m r -> ByteStream m (ByteStream m r))
-> ByteStream m r
-> m x
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
                               Int64 -> ByteStream m r -> ByteStream m (ByteStream m r)
forall (m :: * -> *) r.
Monad m =>
Int64 -> ByteStream m r -> ByteStream m (ByteStream m r)
S.splitAt (Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
l)


data EofException = EofException deriving (Int -> EofException -> ShowS
[EofException] -> ShowS
EofException -> String
(Int -> EofException -> ShowS)
-> (EofException -> String)
-> ([EofException] -> ShowS)
-> Show EofException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EofException] -> ShowS
$cshowList :: [EofException] -> ShowS
show :: EofException -> String
$cshow :: EofException -> String
showsPrec :: Int -> EofException -> ShowS
$cshowsPrec :: Int -> EofException -> ShowS
Show, Typeable)
instance Exception EofException where displayException :: EofException -> String
displayException _ = "end-of-file"

data ParseError = ParseError {ParseError -> [String]
errorContexts :: [String], ParseError -> String
errorMessage :: String} deriving (Int -> ParseError -> ShowS
[ParseError] -> ShowS
ParseError -> String
(Int -> ParseError -> ShowS)
-> (ParseError -> String)
-> ([ParseError] -> ShowS)
-> Show ParseError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParseError] -> ShowS
$cshowList :: [ParseError] -> ShowS
show :: ParseError -> String
$cshow :: ParseError -> String
showsPrec :: Int -> ParseError -> ShowS
$cshowsPrec :: Int -> ParseError -> ShowS
Show, Typeable)
instance Exception ParseError where
    displayException :: ParseError -> String
displayException (ParseError ctx :: [String]
ctx msg :: String
msg)
        = "Parse error at " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate ", " [String]
ctx String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
msg

atto :: Monad m => A.Parser a -> Parser r m a
atto :: Parser a -> Parser r m a
atto = (Bytes -> IResult Bytes a) -> Parser r m a
forall (m :: * -> *) a r.
Monad m =>
(Bytes -> IResult Bytes a) -> Parser r m a
go ((Bytes -> IResult Bytes a) -> Parser r m a)
-> (Parser a -> Bytes -> IResult Bytes a)
-> Parser a
-> Parser r m a
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Parser a -> Bytes -> IResult Bytes a
forall a. Parser a -> Bytes -> Result a
A.parse
  where
    go :: (Bytes -> IResult Bytes a) -> Parser r m a
go k :: Bytes -> IResult Bytes a
k = (forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
forall r (m :: * -> *) a.
(forall x.
 (a -> ByteStream m r -> m x)
 -> (r -> m x)
 -> (SomeException -> ByteStream m r -> m x)
 -> ByteStream m r
 -> m x)
-> Parser r m a
P ((forall x.
  (a -> ByteStream m r -> m x)
  -> (r -> m x)
  -> (SomeException -> ByteStream m r -> m x)
  -> ByteStream m r
  -> m x)
 -> Parser r m a)
-> (forall x.
    (a -> ByteStream m r -> m x)
    -> (r -> m x)
    -> (SomeException -> ByteStream m r -> m x)
    -> ByteStream m r
    -> m x)
-> Parser r m a
forall a b. (a -> b) -> a -> b
$ \sk :: a -> ByteStream m r -> m x
sk rk :: r -> m x
rk ek :: SomeException -> ByteStream m r -> m x
ek ->
        ByteStream m r -> m (Either r (Bytes, ByteStream m r))
forall (m :: * -> *) r.
Monad m =>
ByteStream m r -> m (Either r (Bytes, ByteStream m r))
S.nextChunk (ByteStream m r -> m (Either r (Bytes, ByteStream m r)))
-> (Either r (Bytes, ByteStream m r) -> m x)
-> ByteStream m r
-> m x
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> \case
            Left r :: r
r -> case Bytes -> IResult Bytes a
k Bytes
B.empty of
                      A.Fail _ err :: [String]
err dsc :: String
dsc -> SomeException -> ByteStream m r -> m x
ek (ParseError -> SomeException
forall e. Exception e => e -> SomeException
toException ([String] -> String -> ParseError
ParseError [String]
err String
dsc)) (r -> ByteStream m r
forall (f :: * -> *) a. Applicative f => a -> f a
pure r
r)
                      A.Partial _      -> SomeException -> ByteStream m r -> m x
ek (EofException -> SomeException
forall e. Exception e => e -> SomeException
toException EofException
EofException) (r -> ByteStream m r
forall (f :: * -> *) a. Applicative f => a -> f a
pure r
r)
                      A.Done rest :: Bytes
rest v :: a
v    -> a -> ByteStream m r -> m x
sk a
v (Bytes -> ByteStream m r -> ByteStream m r
forall (m :: * -> *) r. Bytes -> ByteStream m r -> ByteStream m r
S.consChunk Bytes
rest (r -> ByteStream m r
forall (f :: * -> *) a. Applicative f => a -> f a
pure r
r))
            Right (c :: Bytes
c,s' :: ByteStream m r
s')
                | Bytes -> Bool
B.null Bytes
c -> Parser r m a
-> (a -> ByteStream m r -> m x)
-> (r -> m x)
-> (SomeException -> ByteStream m r -> m x)
-> ByteStream m r
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP ((Bytes -> IResult Bytes a) -> Parser r m a
go Bytes -> IResult Bytes a
k) a -> ByteStream m r -> m x
sk r -> m x
rk SomeException -> ByteStream m r -> m x
ek ByteStream m r
s'
                | Bool
otherwise -> case Bytes -> IResult Bytes a
k Bytes
c of
                      A.Fail _ err :: [String]
err dsc :: String
dsc -> SomeException -> ByteStream m r -> m x
ek (ParseError -> SomeException
forall e. Exception e => e -> SomeException
toException ([String] -> String -> ParseError
ParseError [String]
err String
dsc)) ByteStream m r
s'
                      A.Partial k' :: Bytes -> IResult Bytes a
k'     -> Parser r m a
-> (a -> ByteStream m r -> m x)
-> (r -> m x)
-> (SomeException -> ByteStream m r -> m x)
-> ByteStream m r
-> m x
forall r (m :: * -> *) a.
Parser r m a
-> forall x.
   (a -> ByteStream m r -> m x)
   -> (r -> m x)
   -> (SomeException -> ByteStream m r -> m x)
   -> ByteStream m r
   -> m x
runP ((Bytes -> IResult Bytes a) -> Parser r m a
go Bytes -> IResult Bytes a
k') a -> ByteStream m r -> m x
sk r -> m x
rk SomeException -> ByteStream m r -> m x
ek ByteStream m r
s'
                      A.Done rest :: Bytes
rest v :: a
v    -> a -> ByteStream m r -> m x
sk a
v (Bytes -> ByteStream m r -> ByteStream m r
forall (m :: * -> *) r. Bytes -> ByteStream m r -> ByteStream m r
S.consChunk Bytes
rest ByteStream m r
s')