on master help sign in
Unspecialize the ParserK type
commit7e761ca91a42bfba35b1b295bb970641baa9d51f authorAdithya Kumar <adithya@composewell.com> dateSun 6 Aug 2023, 13:37 (3 years ago) parent40e89fb
3 files changed+17−11
core/src/Streamly/Data/ParserK.hs+2−1 core/src/Streamly/Internal/Data/Parser/ParserK/Type.hs+13−8 core/src/Streamly/Internal/Data/StreamK.hs+2−2
core/src/Streamly/Data/ParserK.hs+2−1
@@ -33,6 +33,7 @@ where
3333import Control.Monad.IO.Class (MonadIO)
3434import Streamly.Internal.Data.Fold (Fold)
3535import Streamly.Internal.Data.Unbox (Unbox)
36+import Streamly.Internal.Data.Array (Array)
3637import qualified Streamly.Internal.Data.Parser as ParserD
3738
3839import Streamly.Internal.Data.Parser.ParserK.Type
@@ -40,5 +41,5 @@ import Streamly.Internal.Data.Parser.ParserK.Type
4041-- | Convert a 'Fold' to a 'ParserK'.
4142--
4243{-# INLINE fromFold #-}
43−fromFold :: (MonadIO m, Unbox a) => Fold m a b -> ParserK a m b
44+fromFold :: (MonadIO m, Unbox a) => Fold m a b -> ParserK (Array a) m b
4445fromFold = fromParser . ParserD.fromFold
core/src/Streamly/Internal/Data/Parser/ParserK/Type.hs+13−8
@@ -56,7 +56,15 @@ import qualified Streamly.Internal.Data.Parser.ParserD.Type as ParserD
5656-- Note: We cannot use an Array directly as input because we need to identify
5757-- the end of input case using None. We cannot do that using nil Array as nil
5858-- Arrays can be encountered in normal input as well.
59−data Input a = None | Chunk {-# UNPACK #-} !(Array a)
59+--
60+-- We could specialize the ParserK type to use an Array directly, that provides
61+-- some performance improvement. The best advantage of that is when we consume
62+-- one element at a time from the array. If we really want that perf
63+-- improvement we can use a special ParserK type with the following Input.
64+--
65+-- data Input a = None | Chunk {-# UNPACK #-} !(Array a)
66+--
67+data Input a = None | Chunk a
6068
6169-- | The intermediate result of running a parser step. The parser driver may
6270-- stop with a final result, pause with a continuation to resume, or fail with
@@ -72,9 +80,6 @@ data Step a m r =
7280 -- The Int is the current stream position index wrt to the start of the
7381 -- array.
7482 Done !Int r
75− -- XXX we can use a "resume" and a "stop" continuations instead of Maybe.
76− -- measure if that works any better.
77− -- Array a -> m (Step a m r), m (Step a m r)
7883 | Partial !Int (Input a -> m (Step a m r))
7984 | Continue !Int (Input a -> m (Step a m r))
8085 | Error !Int String
@@ -371,11 +376,11 @@ parseDToK
371376 => (s -> a -> m (ParserD.Step s b))
372377 -> m (ParserD.Initial s b)
373378 -> (s -> m (ParserD.Step s b))
374− -> (ParseResult b -> Int -> Input a -> m (Step a m r))
379+ -> (ParseResult b -> Int -> Input (Array a) -> m (Step (Array a) m r))
375380 -> Int
376381 -> Int
377− -> Input a
378− -> m (Step a m r)
382+ -> Input (Array a)
383+ -> m (Step (Array a) m r)
379384parseDToK pstep initial extract cont !offset0 !usedCount !input = do
380385 res <- initial
381386 case res of
@@ -494,7 +499,7 @@ parseDToK pstep initial extract cont !offset0 !usedCount !input = do
494499-- /Pre-release/
495500--
496501{-# INLINE_LATE fromParser #-}
497−fromParser :: (Monad m, Unbox a) => ParserD.Parser a m b -> ParserK a m b
502+fromParser :: (Monad m, Unbox a) => ParserD.Parser a m b -> ParserK (Array a) m b
498503fromParser (ParserD.Parser step initial extract) =
499504 MkParser $ parseDToK step initial extract
500505
core/src/Streamly/Internal/Data/StreamK.hs+2−2
@@ -1327,7 +1327,7 @@ parserDone (ParserK.Failure n e) _ _ = pure $ ParserK.Error n e
13271327{-# INLINE_NORMAL parseBreakChunks #-}
13281328parseBreakChunks
13291329 :: (Monad m, Unbox a)
1330− => ParserK a m b
1330+ => ParserK (Array a) m b
13311331 -> StreamK m (Array a)
13321332 -> m (Either ParseError b, StreamK m (Array a))
13331333parseBreakChunks parser input = do
@@ -1421,7 +1421,7 @@ parseBreakChunks parser input = do
14211421
14221422{-# INLINE parseChunks #-}
14231423parseChunks :: (Monad m, Unbox a) =>
1424− ParserK a m b -> StreamK m (Array a) -> m (Either ParseError b)
1424+ ParserK (Array a) m b -> StreamK m (Array a) -> m (Either ParseError b)
14251425parseChunks f = fmap fst . parseBreakChunks f
14261426
14271427-------------------------------------------------------------------------------