@@ -43,6 +43,7 @@ module Streamly.Internal.Data.StreamK
4343 , parseDBreak
4444 , parseD
4545 , parseBreak
46+ , parseBreakPos
4647 , parse
4748
4849 -- ** Specialized Folds
@@ -153,6 +154,7 @@ import qualified Streamly.Internal.Data.Array as Array
153154import qualified Streamly.Internal.Data.Array.Generic as GenArr
154155import qualified Streamly.Internal.Data.Fold.Type as FL
155156import qualified Streamly.Internal.Data.Parser as Parser
157+ import qualified Streamly.Internal.Data.ParserDrivers as Drivers
156158import qualified Streamly.Internal.Data.Parser.Type as PR
157159import qualified Streamly.Internal.Data.ParserK.Type as ParserK
158160import qualified Streamly.Internal.Data.Stream as Stream
@@ -1295,131 +1297,26 @@ parseChunks = Array.parse
12951297-- ParserK Singular
12961298-------------------------------------------------------------------------------
12971299
1298- #ifndef PARSER_WITH_POS
1299- #define PARSE_BREAK parseBreak
1300- #define OPTIONAL(x)
1301- #define DEFAULT(x) 0
1302- #else
1303- #define PARSE_BREAK parseBreakPos
1304- #define OPTIONAL(x) (x)
1305- #define DEFAULT(x) (x)
1306- #endif
1307-
13081300-- | Similar to 'parseBreak' but works on singular elements.
13091301--
1310- {-# INLINE_NORMAL PARSE_BREAK #-}
1311- PARSE_BREAK
1302+ {-# INLINE parseBreak #-}
1303+ parseBreak
13121304 :: forall m a b . Monad m
13131305 => ParserK. ParserK a m b
13141306 -> StreamK m a
13151307 -> m (Either ParseError b , StreamK m a )
1316- PARSE_BREAK parser input = do
1317- let parserk = ParserK. runParser parser ParserK. parserDone 0 0
1318- in go OPTIONAL (0 ) [] parserk input
1319-
1320- where
1308+ parseBreak = Drivers. parseBreakStreamK
13211309
1322- {-# INLINE backtrack #-}
1323- -- backtrack :: Int -> [a] -> StreamK m a -> (StreamK m a, [a])
1324- backtrack n xs stream =
1325- let (pre, post) = Stream. splitAt " Data.StreamK.parseBreak" n xs
1326- in (append (fromList (Prelude. reverse pre)) stream, post)
1327-
1328- {-# INLINE goStop #-}
1329- goStop
1330- :: OPTIONAL (Int -> )
1331- [a ]
1332- -> (ParserK. Input a -> m (ParserK. Step a m b ))
1333- -> m (Either ParseError b , StreamK m a )
1334- goStop OPTIONAL (pos) backBuf parserk = do
1335- pRes <- parserk ParserK. None
1336- case pRes of
1337- -- If we stop in an alternative, it will try calling the next
1338- -- parser, the next parser may call initial returning Partial and
1339- -- then immediately we have to call extract on it.
1340- ParserK. Partial 0 cont1 ->
1341- go OPTIONAL (pos) [] cont1 nil
1342- ParserK. Partial n cont1 -> do
1343- let n1 = negate n
1344- assertM(n1 >= 0 && n1 <= length backBuf)
1345- let (s1, backBuf1) = backtrack n1 backBuf nil
1346- in go OPTIONAL (pos + n) backBuf1 cont1 s1
1347- ParserK. Continue 0 cont1 ->
1348- go OPTIONAL (pos) backBuf cont1 nil
1349- ParserK. Continue n cont1 -> do
1350- let n1 = negate n
1351- assertM(n1 >= 0 && n1 <= length backBuf)
1352- let (s1, backBuf1) = backtrack n1 backBuf nil
1353- in go OPTIONAL (pos + n) backBuf1 cont1 s1
1354- ParserK. Done 0 b ->
1355- return (Right b, nil)
1356- ParserK. Done n b -> do
1357- let n1 = negate n
1358- assertM(n1 >= 0 && n1 <= length backBuf)
1359- let (s1, _) = backtrack n1 backBuf nil
1360- in return (Right b, s1)
1361- ParserK. Error n err ->
1362- let strm = fromList (Prelude. reverse backBuf)
1363- in return (Left (ParseError (DEFAULT (pos) + n) err), strm)
1364-
1365- yieldk
1366- :: OPTIONAL (Int -> )
1367- [a ]
1368- -> (ParserK. Input a -> m (ParserK. Step a m b ))
1369- -> a
1370- -> StreamK m a
1371- -> m (Either ParseError b , StreamK m a )
1372- yieldk OPTIONAL (pos) backBuf parserk element stream = do
1373- pRes <- parserk (ParserK. Chunk element)
1374- -- NOTE: factoring out "cons element stream" in a let statement here
1375- -- cause big alloc regression.
1376- case pRes of
1377- ParserK. Partial 1 cont1 -> go OPTIONAL (pos + 1 ) [] cont1 stream
1378- ParserK. Partial 0 cont1 -> go OPTIONAL (pos) [] cont1 (cons element stream)
1379- ParserK. Partial n cont1 -> do -- n < 0 case
1380- let n1 = negate n
1381- bufLen = length backBuf
1382- s = cons element stream
1383- assertM(n1 >= 0 && n1 <= bufLen)
1384- let (s1, _) = backtrack n1 backBuf s
1385- go OPTIONAL (pos + n) [] cont1 s1
1386- ParserK. Continue 1 cont1 -> go OPTIONAL (pos + 1 ) (element: backBuf) cont1 stream
1387- ParserK. Continue 0 cont1 ->
1388- go OPTIONAL (pos) backBuf cont1 (cons element stream)
1389- ParserK. Continue n cont1 -> do
1390- let n1 = negate n
1391- bufLen = length backBuf
1392- s = cons element stream
1393- assertM(n1 >= 0 && n1 <= bufLen)
1394- let (s1, backBuf1) = backtrack n1 backBuf s
1395- go OPTIONAL (pos + n) backBuf1 cont1 s1
1396- ParserK. Done 1 b -> pure (Right b, stream)
1397- ParserK. Done 0 b -> pure (Right b, cons element stream)
1398- ParserK. Done n b -> do
1399- let n1 = negate n
1400- bufLen = length backBuf
1401- s = cons element stream
1402- assertM(n1 >= 0 && n1 <= bufLen)
1403- let (s1, _) = backtrack n1 backBuf s
1404- pure (Right b, s1)
1405- ParserK. Error n err ->
1406- let strm =
1407- append
1408- (fromList (Prelude. reverse backBuf))
1409- (cons element stream)
1410- in return (Left (ParseError (DEFAULT (pos) + n + 1 ) err), strm)
1411-
1412- go
1413- :: OPTIONAL (Int -> )
1414- [a ]
1415- -> (ParserK. Input a -> m (ParserK. Step a m b ))
1416- -> StreamK m a
1417- -> m (Either ParseError b , StreamK m a )
1418- go OPTIONAL (pos) backBuf parserk stream = do
1419- let stop = goStop OPTIONAL (pos) backBuf parserk
1420- single a = yieldk OPTIONAL (pos) backBuf parserk a nil
1421- in foldStream
1422- defState (yieldk OPTIONAL (pos) backBuf parserk) single stop stream
1310+ -- | Like 'parseBreak' but includes stream position information in the error
1311+ -- messages.
1312+ --
1313+ {-# INLINE parseBreakPos #-}
1314+ parseBreakPos
1315+ :: forall m a b . Monad m
1316+ => ParserK. ParserK a m b
1317+ -> StreamK m a
1318+ -> m (Either ParseError b , StreamK m a )
1319+ parseBreakPos = Drivers. parseBreakStreamKPos
14231320
14241321-- | Run a 'ParserK' over a 'StreamK'. Please use 'parseChunks' where possible,
14251322-- for better performance.
0 commit comments