@@ -277,11 +277,17 @@ sequence_ value xs =
277277-- choice using the "Alternative" instance with direct style parser type has
278278-- quadratic performance complexity.
279279--
280+{-# INLINE choiceAsum #-}
281+choiceAsum :: MonadCatch m => Int -> SerialT m Int -> m Int
282+choiceAsum value =
283+ IP.parseD (asum (replicate value (PR.satisfy (< 0)))
284+ AP.<|> PR.satisfy (> 0))
285+
280286{-# INLINE choice #-}
281287choice :: MonadCatch m => Int -> SerialT m Int -> m Int
282288choice value =
283− IP.parseD (asum (replicate value (PR.satisfy (< 0)))
284− AP.<|> PR.satisfy (> 0))
289+ IP.parseD
290+ (PR.choice (replicate value (PR.satisfy (< 0))) AP.<|> PR.satisfy (> 0))
285291
286292-------------------------------------------------------------------------------
287293-- Benchmarks
@@ -356,6 +362,7 @@ o_n_space_serial value =
356362 , benchIOSink value "sequenceA_/100" $ sequenceA_ (value `div` 100)
357363 , benchIOSink value "sequence/100" $ sequence (value `div` 100)
358364 , benchIOSink value "sequence_/100" $ sequence_ (value `div` 100)
365+ , benchIOSink value "choice (asum)/100" $ choiceAsum (value `div` 100)
359366 , benchIOSink value "choice/100" $ choice (value `div` 100)
360367 ]
361368