@@ -277,11 +277,17 @@ sequence_ value xs =
277-- choice using the "Alternative" instance with direct style parser type has
277-- choice using the "Alternative" instance with direct style parser type has
278-- quadratic performance complexity.
278-- quadratic performance complexity.
280+{-# INLINE choiceAsum #-}
281+choiceAsum :: MonadCatch m => Int -> SerialT m Int -> m Int
283+ IP.parseD (asum (replicate value (PR.satisfy (< 0)))
284+ AP.<|> PR.satisfy (> 0))
280{-# INLINE choice #-}
286{-# INLINE choice #-}
281choice :: MonadCatch m => Int -> SerialT m Int -> m Int
287choice :: MonadCatch m => Int -> SerialT m Int -> m Int
282choice value =
288choice value =
283− IP.parseD (asum (replicate value (PR.satisfy (< 0)))
290+ (PR.choice (replicate value (PR.satisfy (< 0))) AP.<|> PR.satisfy (> 0))
284− AP.<|> PR.satisfy (> 0))
286-------------------------------------------------------------------------------
292-------------------------------------------------------------------------------
287-- Benchmarks
293-- Benchmarks
@@ -356,6 +362,7 @@ o_n_space_serial value =
356 , benchIOSink value "sequenceA_/100" $ sequenceA_ (value `div` 100)
362 , benchIOSink value "sequenceA_/100" $ sequenceA_ (value `div` 100)
357 , benchIOSink value "sequence/100" $ sequence (value `div` 100)
363 , benchIOSink value "sequence/100" $ sequence (value `div` 100)
358 , benchIOSink value "sequence_/100" $ sequence_ (value `div` 100)
364 , benchIOSink value "sequence_/100" $ sequence_ (value `div` 100)
365+ , benchIOSink value "choice (asum)/100" $ choiceAsum (value `div` 100)
359 , benchIOSink value "choice/100" $ choice (value `div` 100)
366 , benchIOSink value "choice/100" $ choice (value `div` 100)