@@ -83,6 +83,7 @@ module Streamly.Internal.Data.Parser.ParserD
83 -- Words and grouping
83 -- Words and grouping
85 , wordFramedBy
85 , wordFramedBy
87 , groupByRolling
88 , groupByRolling
88 , groupByRollingEither
89 , groupByRollingEither
@@ -1123,6 +1124,107 @@ wordFramedBy isEsc isBegin isEnd isSep
1123 err "wordFramedBy: trailing escape"
1124 err "wordFramedBy: trailing escape"
1124 extract (WordFramedSkipPost b) = return b
1125 extract (WordFramedSkipPost b) = return b
1127+data WordQuotedState s b a =
1128+ WordQuotedSkipPre !s
1129+ | WordUnquotedWord !s
1130+ | WordQuotedWord !s !Int a
1131+ | WordUnquotedEsc !s
1132+ | WordQuotedEsc !s !Int a
1133+ | WordQuotedSkipPost !b
1135+{-# INLINE wordQuotedBy #-}
1136+wordQuotedBy :: (MonadCatch m, Eq a) =>
1137+ (a -> Bool) -- ^ Escape
1138+ -> (a -> Bool) -- ^ left quote
1139+ -> (a -> Bool) -- ^ right quote
1140+ -> (a -> a) -- ^ get right quote from the left quote
1141+ -> (a -> Bool) -- ^ word seperator
1144+wordQuotedBy isEsc isBegin isEnd toRight isSep
1145+ (Fold fstep finitial fextract) =
1146+ Parser step initial extract
1154+ FL.Partial s -> IPartial (WordQuotedSkipPre s)
1156+ error "wordQuotedBy: fold done without input"
1158+ {-# INLINE process #-}
1159+ process s a n q = do
1163+ FL.Partial s1 -> Continue 0 (WordQuotedWord s1 n q)
1164+ FL.Done b -> Done 0 b
1166+ {-# INLINE processUnquoted #-}
1167+ processUnquoted s a = do
1171+ FL.Partial s1 -> Continue 0 (WordUnquotedWord s1)
1172+ FL.Done b -> Done 0 b
1174+ step (WordQuotedSkipPre s) a
1175+ | isEsc a = return $ Continue 0 $ WordUnquotedEsc s
1176+ | isSep a = return $ Partial 0 $ WordQuotedSkipPre s
1177+ | isBegin a = return $ Continue 0 $ WordQuotedWord s 1 a
1179+ return $ Error "wordQuotedBy: missing frame start"
1180+ | otherwise = processUnquoted s a
1181+ step (WordUnquotedWord s) a
1182+ | isEsc a = return $ Continue 0 $ WordUnquotedEsc s
1185+ return $ Partial 0 $ WordQuotedSkipPost b
1188+ then return $ Continue 0 $ WordQuotedWord s 1 a
1190+ then return $ Error "wordQuotedBy: missing frame start"
1191+ else processUnquoted s a
1192+ step (WordQuotedWord s n q) a
1193+ | isEsc a = return $ Continue 0 $ WordQuotedEsc s n q
1194+ | n == 0 && isSep a = do
1196+ return $ Partial 0 $ WordQuotedSkipPost b
1201+ then return $ Continue 0 $ WordUnquotedWord s
1202+ else process s a (n - 1) q
1204+ then process s a (n + 1) q
1205+ else process s a n q
1206+ step (WordUnquotedEsc s) a = processUnquoted s a
1207+ step (WordQuotedEsc s n q) a = process s a n q
1208+ step (WordQuotedSkipPost b) a =
1212+ else Partial 0 $ WordQuotedSkipPost b
1214+ err = throwM . ParseError
1216+ extract (WordQuotedSkipPre s) = fextract s
1217+ extract (WordUnquotedWord s) = fextract s
1218+ extract (WordQuotedWord s n _) =
1221+ else err "wordQuotedBy: missing frame end"
1222+ extract WordQuotedEsc {} =
1223+ err "wordQuotedBy: trailing escape"
1224+ extract (WordUnquotedEsc _) =
1225+ err "wordQuotedBy: trailing escape"
1226+ extract (WordQuotedSkipPost b) = return b
1126{-# ANN type GroupByState Fuse #-}
1228{-# ANN type GroupByState Fuse #-}
1127data GroupByState a s
1229data GroupByState a s
1128 = GroupByInit !s
1230 = GroupByInit !s