{-# 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
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 #-}