{-# LANGUAGE MagicHash #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UnboxedTuples #-}

module Data.PrimParser where

import Control.Applicative (Applicative (..))
import Control.Monad
import qualified Data.ByteString as B
import qualified Data.ByteString.Internal as B
import Data.Function
import Foreign
import GHC.Exts
import GHC.Word
import System.IO
import Prelude hiding (Applicative (..))

newtype PrimParser a = PrimParser
  { forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# ::
      Addr# ->
      Addr# ->
      (# Addr#, a #)
  }

instance Functor PrimParser where
  fmap :: forall a b. (a -> b) -> PrimParser a -> PrimParser b
fmap a -> b
f PrimParser a
mx = (Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b)
-> (Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p -> case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
mx Addr#
e Addr#
p of
    (# Addr#
p', a
x #) -> (# Addr#
p', a -> b
f a
x #)
  {-# INLINE fmap #-}

instance Applicative PrimParser where
  pure :: forall a. a -> PrimParser a
pure a
x = (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a)
-> (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p -> (# Addr#
p, a
x #)
  {-# INLINE pure #-}
  PrimParser (a -> b)
mf <*> :: forall a b. PrimParser (a -> b) -> PrimParser a -> PrimParser b
<*> PrimParser a
mx = (Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b)
-> (Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p -> case PrimParser (a -> b) -> Addr# -> Addr# -> (# Addr#, a -> b #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser (a -> b)
mf Addr#
e Addr#
p of
    (# Addr#
p', a -> b
f #) -> case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
mx Addr#
e Addr#
p' of
      (# Addr#
p'', a
x #) -> (# Addr#
p'', a -> b
f a
x #)
  {-# INLINE (<*>) #-}
  liftA2 :: forall a b c.
(a -> b -> c) -> PrimParser a -> PrimParser b -> PrimParser c
liftA2 a -> b -> c
f PrimParser a
mx PrimParser b
my = (Addr# -> Addr# -> (# Addr#, c #)) -> PrimParser c
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, c #)) -> PrimParser c)
-> (Addr# -> Addr# -> (# Addr#, c #)) -> PrimParser c
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p -> case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
mx Addr#
e Addr#
p of
    (# Addr#
p', a
x #) -> case PrimParser b -> Addr# -> Addr# -> (# Addr#, b #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser b
my Addr#
e Addr#
p' of
      (# Addr#
p'', b
y #) -> (# Addr#
p'', a -> b -> c
f a
x b
y #)
  {-# INLINE liftA2 #-}

instance Monad PrimParser where
  PrimParser a
mx >>= :: forall a b. PrimParser a -> (a -> PrimParser b) -> PrimParser b
>>= a -> PrimParser b
f = (Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b)
-> (Addr# -> Addr# -> (# Addr#, b #)) -> PrimParser b
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p -> case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
mx Addr#
e Addr#
p of
    (# Addr#
p', a
x #) -> PrimParser b -> Addr# -> Addr# -> (# Addr#, b #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# (a -> PrimParser b
f a
x) Addr#
e Addr#
p'
  {-# INLINE (>>=) #-}

runPrimParser :: PrimParser a -> Ptr Word8 -> Ptr Word8 -> (a, Ptr Word8)
runPrimParser :: forall a. PrimParser a -> Ptr Word8 -> Ptr Word8 -> (a, Ptr Word8)
runPrimParser PrimParser a
f (Ptr Addr#
e#) (Ptr Addr#
p#) = case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
f Addr#
e# Addr#
p# of
  (# Addr#
p', a
x #) -> (a
x, Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
p')
{-# INLINE runPrimParser #-}

withByteString :: B.ByteString -> (a -> IO r) -> PrimParser a -> IO r
withByteString :: forall a r. ByteString -> (a -> IO r) -> PrimParser a -> IO r
withByteString ByteString
bs a -> IO r
k PrimParser a
f = case ByteString -> (ForeignPtr Word8, Int, Int)
B.toForeignPtr ByteString
bs of
  (ForeignPtr Word8
fp, Int
o, I# Int#
len#) -> do
    ForeignPtr Any -> (Ptr Any -> IO r) -> IO r
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr (ForeignPtr Word8 -> Int -> ForeignPtr Any
forall a b. ForeignPtr a -> Int -> ForeignPtr b
plusForeignPtr ForeignPtr Word8
fp Int
o) ((Ptr Any -> IO r) -> IO r) -> (Ptr Any -> IO r) -> IO r
forall a b. (a -> b) -> a -> b
$ \(Ptr Addr#
p#) -> do
      case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
f (Addr# -> Int# -> Addr#
plusAddr# Addr#
p# Int#
len#) Addr#
p# of
        (# Addr#
_, a
x #) -> a -> IO r
k a
x

unsafeWithByteString :: B.ByteString -> PrimParser a -> a
unsafeWithByteString :: forall a. ByteString -> PrimParser a -> a
unsafeWithByteString ByteString
bs PrimParser a
f =
  IO a -> a
forall a. IO a -> a
B.accursedUnutterablePerformIO
    (IO a -> a) -> IO a -> a
forall a b. (a -> b) -> a -> b
$ ByteString -> (a -> IO a) -> PrimParser a -> IO a
forall a r. ByteString -> (a -> IO r) -> PrimParser a -> IO r
withByteString ByteString
bs a -> IO a
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return PrimParser a
f

withInputHandle :: Handle -> (a -> IO r) -> PrimParser a -> IO r
withInputHandle :: forall a r. Handle -> (a -> IO r) -> PrimParser a -> IO r
withInputHandle Handle
h a -> IO r
k PrimParser a
f = do
  ByteString
bs <- Handle -> IO ByteString
B.hGetContents Handle
h
  ByteString -> (a -> IO r) -> PrimParser a -> IO r
forall a r. ByteString -> (a -> IO r) -> PrimParser a -> IO r
withByteString ByteString
bs a -> IO r
k PrimParser a
f

withInputHandleUpToN :: Handle -> Int -> (a -> IO r) -> PrimParser a -> IO r
withInputHandleUpToN :: forall a r. Handle -> Int -> (a -> IO r) -> PrimParser a -> IO r
withInputHandleUpToN Handle
h Int
bufSize a -> IO r
k PrimParser a
f = do
  ForeignPtr Any
buf <- Int -> IO (ForeignPtr Any)
forall a. Int -> IO (ForeignPtr a)
mallocForeignPtrBytes Int
bufSize
  ForeignPtr Any -> (Ptr Any -> IO r) -> IO r
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Any
buf ((Ptr Any -> IO r) -> IO r) -> (Ptr Any -> IO r) -> IO r
forall a b. (a -> b) -> a -> b
$ \ibuf :: Ptr Any
ibuf@(Ptr Addr#
ibuf#) -> do
    isize :: Int
isize@(I# Int#
isize#) <- Handle -> Ptr Any -> Int -> IO Int
forall a. Handle -> Ptr a -> Int -> IO Int
hGetBufNonBlocking Handle
h Ptr Any
ibuf Int
bufSize
    forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff @Word8 (Ptr Any -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr Any
ibuf Int
isize) Int
0 Word8
10 -- sentinel ('\n')
    case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
f (Addr# -> Int# -> Addr#
plusAddr# Addr#
ibuf# (Int#
isize# Int# -> Int# -> Int#
+# Int#
1#)) Addr#
ibuf# of
      (# Addr#
_, a
x #) -> a -> IO r
k a
x

viewPrimParser :: PrimParser (Ptr Word8, Ptr Word8)
viewPrimParser :: PrimParser (Ptr Word8, Ptr Word8)
viewPrimParser = (Addr# -> Addr# -> (# Addr#, (Ptr Word8, Ptr Word8) #))
-> PrimParser (Ptr Word8, Ptr Word8)
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, (Ptr Word8, Ptr Word8) #))
 -> PrimParser (Ptr Word8, Ptr Word8))
-> (Addr# -> Addr# -> (# Addr#, (Ptr Word8, Ptr Word8) #))
-> PrimParser (Ptr Word8, Ptr Word8)
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p ->
  (# Addr#
p, (Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
e, Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
p) #)

viewPrimParserAsByteString :: PrimParser B.ByteString
viewPrimParserAsByteString :: PrimParser ByteString
viewPrimParserAsByteString = (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, ByteString #))
 -> PrimParser ByteString)
-> (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p ->
  let n :: Int
n = Int# -> Int
I# (Addr# -> Addr# -> Int#
minusAddr# Addr#
e Addr#
p)
      bs :: ByteString
bs = Int -> (Ptr Word8 -> IO ()) -> ByteString
B.unsafeCreate Int
n ((Ptr Word8 -> IO ()) -> ByteString)
-> (Ptr Word8 -> IO ()) -> ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
dst ->
        Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytes Ptr Word8
dst (Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
p) Int
n
   in (# Addr#
p, ByteString
bs #)

wordP# :: Addr# -> Word# -> (# Addr#, Word# #)
wordP# :: Addr# -> Word# -> (# Addr#, Word# #)
wordP# Addr#
p# Word#
acc# = case Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p# Int#
0#) of
  Word#
c
    | Int# -> Bool
isTrue# (Word# -> Word# -> Int#
geWord# Word#
c Word#
0x30##) ->
        Addr# -> Word# -> (# Addr#, Word# #)
wordP#
          (Addr# -> Int# -> Addr#
plusAddr# Addr#
p# Int#
1#)
          (Word# -> Word# -> Word#
plusWord# (Word# -> Word# -> Word#
and# Word#
c Word#
0x0f##) (Word# -> Word# -> Word#
timesWord# Word#
10## Word#
acc#))
    | Bool
otherwise -> (# Addr#
p#, Word#
acc# #)

intP :: PrimParser Int
intP :: PrimParser Int
intP = (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int)
-> (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0#) of
    Word#
0x2d## -> case Addr# -> Word# -> (# Addr#, Word# #)
wordP# (Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#) Word#
0## of
      (# Addr#
p', Word#
w #) -> (# Addr#
p', Int# -> Int
I# (Int# -> Int#
negateInt# (Word# -> Int#
word2Int# Word#
w)) #)
    Word#
c -> case Addr# -> Word# -> (# Addr#, Word# #)
wordP# (Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#) (Word# -> Word# -> Word#
and# Word#
c Word#
0xf##) of
      (# Addr#
p', Word#
w #) -> (# Addr#
p', Int# -> Int
I# (Word# -> Int#
word2Int# Word#
w) #)
{-# INLINE intP #-}

wordP :: PrimParser Word
wordP :: PrimParser Word
wordP = (Addr# -> Addr# -> (# Addr#, Word #)) -> PrimParser Word
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Word #)) -> PrimParser Word)
-> (Addr# -> Addr# -> (# Addr#, Word #)) -> PrimParser Word
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Word# -> (# Addr#, Word# #)
wordP# Addr#
p Word#
0## of
    (# Addr#
p', Word#
w #) -> (# Addr#
p', Word# -> Word
W# Word#
w #)
{-# INLINE wordP #-}

doubleP :: PrimParser Double
doubleP :: PrimParser Double
doubleP = (Addr# -> Addr# -> (# Addr#, Double #)) -> PrimParser Double
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Double #)) -> PrimParser Double)
-> (Addr# -> Addr# -> (# Addr#, Double #)) -> PrimParser Double
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0#) of
    Word#
0x2d## -> case Addr# -> Word# -> (# Addr#, Double# #)
unsignedDoubleP# (Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#) Word#
0## of
      (# Addr#
p', Double#
d #) -> (# Addr#
p', Double# -> Double
D# (Double# -> Double#
negateDouble# Double#
d) #)
    Word#
c -> case Addr# -> Word# -> (# Addr#, Double# #)
unsignedDoubleP# (Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#) (Word# -> Word# -> Word#
and# Word#
c Word#
0xf##) of
      (# Addr#
p', Double#
d #) -> (# Addr#
p', Double# -> Double
D# Double#
d #)

unsignedDoubleP# :: Addr# -> Word# -> (# Addr#, Double# #)
unsignedDoubleP# :: Addr# -> Word# -> (# Addr#, Double# #)
unsignedDoubleP# Addr#
p Word#
w = case Addr# -> Word# -> (# Addr#, Word# #)
wordP# Addr#
p Word#
w of
  (# Addr#
p', Word#
iw #) -> case Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p' Int#
0#) of
    Word#
0x2e## -> case Addr# -> Word# -> (# Addr#, Word# #)
wordP# (Addr# -> Int# -> Addr#
plusAddr# Addr#
p' Int#
1#) Word#
0## of
      (# Addr#
p'', Word#
fw #) ->
        let ipart :: Double#
ipart = Word# -> Double#
word2Double# Word#
iw
            fpart :: Double#
fpart = Word# -> Double#
word2Double# Word#
fw Double# -> Double# -> Double#
/## Addr# -> Int# -> Double#
indexDoubleOffAddr# Addr#
pow10# (Addr# -> Addr# -> Int#
minusAddr# Addr#
p'' Addr#
p' Int# -> Int# -> Int#
-# Int#
1#)
         in (# Addr#
p'', Double#
ipart Double# -> Double# -> Double#
+## Double#
fpart #)
    Word#
_ -> (# Addr#
p', Word# -> Double#
word2Double# Word#
iw #)
    where
      pow10# :: Addr#
pow10# = Addr#
"\x00\x00\x00\x00\x00\x00\xf0\x3f\x00\x00\x00\x00\x00\x00\x24\x40\x00\x00\x00\x00\x00\x00\x59\x40\x00\x00\x00\x00\x00\x40\x8f\x40\x00\x00\x00\x00\x00\x88\xc3\x40\x00\x00\x00\x00\x00\x6a\xf8\x40\x00\x00\x00\x00\x80\x84\x2e\x41\x00\x00\x00\x00\xd0\x12\x63\x41\x00\x00\x00\x00\x84\xd7\x97\x41\x00\x00\x00\x00\x65\xcd\xcd\x41\x00\x00\x00\x20\x5f\xa0\x02\x42\x00\x00\x00\xe8\x76\x48\x37\x42\x00\x00\x00\xa2\x94\x1a\x6d\x42\x00\x00\x40\xe5\x9c\x30\xa2\x42\x00\x00\x90\x1e\xc4\xbc\xd6\x42\x00\x00\x34\x26\xf5\x6b\x0c\x43\x00\x80\xe0\x37\x79\xc3\x41\x43"#
{-# INLINE unsignedDoubleP# #-}

int :: PrimParser Int
int :: PrimParser Int
int = (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int)
-> (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p ->
  case PrimParser Int -> Addr# -> Addr# -> (# Addr#, Int #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser Int
intP Addr#
e Addr#
p of
    (# Addr#
p', Int
x #) -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p' Int#
1#, Int
x #)
{-# INLINE int #-}

uint :: PrimParser Int
uint :: PrimParser Int
uint = (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int)
-> (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Word# -> (# Addr#, Word# #)
wordP# Addr#
p Word#
0## of
    (# Addr#
p', Word#
x #) -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p' Int#
1#, Int# -> Int
I# (Word# -> Int#
word2Int# Word#
x) #)
{-# INLINE uint #-}

uint1 :: PrimParser Int
uint1 :: PrimParser Int
uint1 = (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int)
-> (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Word# -> (# Addr#, Word# #)
wordP# Addr#
p Word#
0## of
    (# Addr#
p', Word#
x #) -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p' Int#
1#, Int# -> Int
I# (Word# -> Int#
word2Int# Word#
x Int# -> Int# -> Int#
-# Int#
1#) #)
{-# INLINE uint1 #-}

double :: PrimParser Double
double :: PrimParser Double
double = (Addr# -> Addr# -> (# Addr#, Double #)) -> PrimParser Double
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Double #)) -> PrimParser Double)
-> (Addr# -> Addr# -> (# Addr#, Double #)) -> PrimParser Double
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p ->
  case PrimParser Double -> Addr# -> Addr# -> (# Addr#, Double #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser Double
doubleP Addr#
e Addr#
p of
    (# Addr#
p', Double
x #) -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p' Int#
1#, Double
x #)
{-# INLINE double #-}

byte :: PrimParser Word8
byte :: PrimParser Word8
byte = (Addr# -> Addr# -> (# Addr#, Word8 #)) -> PrimParser Word8
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Word8 #)) -> PrimParser Word8)
-> (Addr# -> Addr# -> (# Addr#, Word8 #)) -> PrimParser Word8
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0# of
    Word8#
w8 -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#, Word8# -> Word8
W8# Word8#
w8 #)
{-# INLINE byte #-}

char :: PrimParser Char
char :: PrimParser Char
char = (Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char)
-> (Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0# of
    Word8#
w8 -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#, Word8 -> Char
B.w2c (Word8# -> Word8
W8# Word8#
w8) #)
{-# INLINE char #-}

charSp :: PrimParser Char
charSp :: PrimParser Char
charSp = (Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char)
-> (Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0# of
    Word8#
w8 -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
2#, Word8 -> Char
B.w2c (Word8# -> Word8
W8# Word8#
w8) #)
{-# INLINE charSp #-}

charLn :: PrimParser Char
charLn :: PrimParser Char
charLn = (Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char)
-> (Addr# -> Addr# -> (# Addr#, Char #)) -> PrimParser Char
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0# of
    Word8#
w8 -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
2#, Word8 -> Char
B.w2c (Word8# -> Word8
W8# Word8#
w8) #)
{-# INLINE charLn #-}

digitC :: PrimParser Int
digitC :: PrimParser Int
digitC = (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int)
-> (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0# of
    Word8#
w -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#, Int# -> Int
I# (Word# -> Int#
word2Int# (Word8# -> Word#
word8ToWord# Word8#
w) Int# -> Int# -> Int#
-# Int#
0x30#) #)
{-# INLINE digitC #-}

lowerC :: PrimParser Int
lowerC :: PrimParser Int
lowerC = (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int)
-> (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0# of
    Word8#
w -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#, Int# -> Int
I# (Word# -> Int#
word2Int# (Word8# -> Word#
word8ToWord# Word8#
w) Int# -> Int# -> Int#
-# Int#
0x61#) #)
{-# INLINE lowerC #-}

upperC :: PrimParser Int
upperC :: PrimParser Int
upperC = (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int)
-> (Addr# -> Addr# -> (# Addr#, Int #)) -> PrimParser Int
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  case Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
p Int#
0# of
    Word8#
w -> (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
1#, Int# -> Int
I# (Word# -> Int#
word2Int# (Word8# -> Word#
word8ToWord# Word8#
w) Int# -> Int# -> Int#
-# Int#
0x41#) #)
{-# INLINE upperC #-}

memchrP# :: Addr# -> Addr# -> Word8 -> Addr#
memchrP# :: Addr# -> Addr# -> Word8 -> Addr#
memchrP# Addr#
e Addr#
p Word8
w8 =
  let !(Ptr Addr#
pos) =
        IO (Ptr Word8) -> Ptr Word8
forall a. IO a -> a
B.accursedUnutterablePerformIO
          (IO (Ptr Word8) -> Ptr Word8) -> IO (Ptr Word8) -> Ptr Word8
forall a b. (a -> b) -> a -> b
$ Ptr Word8 -> Word8 -> CSize -> IO (Ptr Word8)
B.memchr (Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
p) Word8
w8 (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int# -> Int
I# (Addr# -> Addr# -> Int#
minusAddr# Addr#
e Addr#
p)))
   in Addr#
pos

memchrNthP# :: Int# -> Addr# -> Addr# -> Word8 -> Addr#
memchrNthP# :: Int# -> Addr# -> Addr# -> Word8 -> Addr#
memchrNthP# Int#
n Addr#
e Addr#
ptr Word8
w8 = Int# -> Addr# -> Addr#
go Int#
n Addr#
ptr
  where
    go :: Int# -> Addr# -> Addr#
go Int#
i Addr#
p
      | Int# -> Bool
isTrue# (Int#
i Int# -> Int# -> Int#
># Int#
1#) = Int# -> Addr# -> Addr#
go (Int#
i Int# -> Int# -> Int#
-# Int#
1#) (Addr# -> Int# -> Addr#
plusAddr# (Addr# -> Addr# -> Word8 -> Addr#
memchrP# Addr#
e Addr#
p Word8
w8) Int#
1#)
      | Bool
otherwise = Addr# -> Addr# -> Word8 -> Addr#
memchrP# Addr#
e Addr#
p Word8
w8

byteStringTo :: Word8 -> PrimParser B.ByteString
byteStringTo :: Word8 -> PrimParser ByteString
byteStringTo Word8
w = (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, ByteString #))
 -> PrimParser ByteString)
-> (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p ->
  let !end :: Addr#
end = Addr# -> Addr# -> Word8 -> Addr#
memchrP# Addr#
e Addr#
p Word8
w
      len :: Int
len = Int# -> Int
I# (Addr# -> Addr# -> Int#
minusAddr# Addr#
end Addr#
p)
      bs :: ByteString
bs = Int -> (Ptr Word8 -> IO ()) -> ByteString
B.unsafeCreate Int
len ((Ptr Word8 -> IO ()) -> ByteString)
-> (Ptr Word8 -> IO ()) -> ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
dst ->
        Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytes Ptr Word8
dst (Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
p) Int
len
   in (# Addr# -> Int# -> Addr#
plusAddr# Addr#
end Int#
1#, ByteString
bs #)
{-# INLINE byteStringTo #-}

byteStringLn :: PrimParser B.ByteString
byteStringLn :: PrimParser ByteString
byteStringLn = Word8 -> PrimParser ByteString
byteStringTo Word8
0xa
{-# INLINE byteStringLn #-}

byteStringSp :: PrimParser B.ByteString
byteStringSp :: PrimParser ByteString
byteStringSp = Word8 -> PrimParser ByteString
byteStringTo Word8
0x20
{-# INLINE byteStringSp #-}

byteStringN :: Int -> PrimParser B.ByteString
byteStringN :: Int -> PrimParser ByteString
byteStringN n :: Int
n@(I# Int#
n#) = (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, ByteString #))
 -> PrimParser ByteString)
-> (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  let bs :: ByteString
bs = Int -> (Ptr Word8 -> IO ()) -> ByteString
B.unsafeCreate Int
n ((Ptr Word8 -> IO ()) -> ByteString)
-> (Ptr Word8 -> IO ()) -> ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
dst ->
        Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytes Ptr Word8
dst (Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
p) Int
n
   in (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p Int#
n#, ByteString
bs #)
{-# INLINE byteStringN #-}

byteStringHW :: Int -> Int -> PrimParser B.ByteString
byteStringHW :: Int -> Int -> PrimParser ByteString
byteStringHW h :: Int
h@(I# Int#
h#) w :: Int
w@(I# Int#
w#) = (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, ByteString #))
 -> PrimParser ByteString)
-> (Addr# -> Addr# -> (# Addr#, ByteString #))
-> PrimParser ByteString
forall a b. (a -> b) -> a -> b
$ \Addr#
_ Addr#
p ->
  let bs :: ByteString
bs = Int -> (Ptr Word8 -> IO ()) -> ByteString
B.unsafeCreate (Int
h Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
w) ((Ptr Word8 -> IO ()) -> ByteString)
-> (Ptr Word8 -> IO ()) -> ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
dst0 ->
        ((Ptr Word8 -> Ptr Word8 -> Int -> IO ())
 -> Ptr Word8 -> Ptr Word8 -> Int -> IO ())
-> Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. (a -> a) -> a
fix
          ( \Ptr Word8 -> Ptr Word8 -> Int -> IO ()
loop !Ptr Word8
dst !Ptr Word8
src !Int
i -> Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
h) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
              Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytes Ptr Word8
dst Ptr Word8
src Int
w
              Ptr Word8 -> Ptr Word8 -> Int -> IO ()
loop (Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr Word8
dst Int
w) (Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr Word8
src (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
          )
          Ptr Word8
dst0
          (Addr# -> Ptr Word8
forall a. Addr# -> Ptr a
Ptr Addr#
p)
          Int
0
   in (# Addr# -> Int# -> Addr#
plusAddr# Addr#
p (Int#
h# Int# -> Int# -> Int#
*# (Int#
w# Int# -> Int# -> Int#
+# Int#
1#)), ByteString
bs #)
{-# INLINE byteStringHW #-}

line :: PrimParser a -> PrimParser a
line :: forall a. PrimParser a -> PrimParser a
line PrimParser a
f = (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a)
-> (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p ->
  case Addr# -> Int# -> Addr#
plusAddr# (Addr# -> Addr# -> Word8 -> Addr#
memchrP# Addr#
e Addr#
p Word8
0xa) Int#
1# of
    Addr#
pos -> case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
f Addr#
pos Addr#
p of
      (# Addr#
_, a
x #) -> (# Addr#
pos, a
x #)
{-# INLINE line #-}

linesN :: Int -> PrimParser a -> PrimParser a
linesN :: forall a. Int -> PrimParser a -> PrimParser a
linesN (I# Int#
n#) PrimParser a
f = (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
forall a. (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
PrimParser ((Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a)
-> (Addr# -> Addr# -> (# Addr#, a #)) -> PrimParser a
forall a b. (a -> b) -> a -> b
$ \Addr#
e Addr#
p ->
  if Int# -> Bool
isTrue# (Int#
n# Int# -> Int# -> Int#
># Int#
0#)
    then case Addr# -> Int# -> Addr#
plusAddr# (Int# -> Addr# -> Addr# -> Word8 -> Addr#
memchrNthP# Int#
n# Addr#
e Addr#
p Word8
0xa) Int#
1# of
      Addr#
pos -> case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
f Addr#
pos Addr#
p of
        (# Addr#
_, a
x #) -> (# Addr#
pos, a
x #)
    else case PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
forall a. PrimParser a -> Addr# -> Addr# -> (# Addr#, a #)
runPrimParser# PrimParser a
f Addr#
p Addr#
p of
      (# Addr#
_, a
x #) -> (# Addr#
p, a
x #)
{-# INLINE linesN #-}