on master help sign in
Make enumerateFromStepNum numerically stable
commita6e8e23062bc640d118f88f6191b63dec912f848 authorHarendra Kumar <harendra@composewell.com> dateWed 24 Mar 2021, 01:02 (6 years ago) parenta5e483b
2 files changed+11−7
src/Streamly/Internal/Data/Unfold.hs+6−3 test/Streamly/Test/Data/Unfold.hs+5−4
src/Streamly/Internal/Data/Unfold.hs+6−3
@@ -694,11 +694,14 @@ dropWhile f = dropWhileM (return . f)
694694--
695695{-# INLINE enumerateFromStepNum #-}
696696enumerateFromStepNum :: (Monad m, Num a) => a -> Unfold m a a
697−enumerateFromStepNum stride = Unfold step return
697+enumerateFromStepNum stride = Unfold step inject
698+
698699 where
699− -- XXX This is numerically unstable.
700+
701+ inject !from = return (from, 0)
702+
700703 {-# INLINE_LATE step #-}
701− step !s = return $ (Yield $! s) $! (s + stride)
704+ step (from, !i) = return $ (Yield $! (from + i * stride)) $! (from, i + 1)
702705
703706-- | @numFrom = enumerateFromStepNum 1@
704707--
test/Streamly/Test/Data/Unfold.hs+5−4
@@ -203,15 +203,14 @@ enumerateFromStepNum =
203203 lst = Prelude.take 10 $ List.unfoldr (\x -> Just (x, x + s)) f
204204 in testUnfoldD unf f lst
205205
206+#if MIN_VERSION_base(4,12,0)
206207enumerateFromToFractional :: Property
207208enumerateFromToFractional =
208209 property
209210 $ \f t ->
210211 let unf = UF.enumerateFromToFractional (t :: Double)
211− list =
212− Prelude.takeWhile (<= t + 0.5)
213− $ List.unfoldr (\x -> Just (x, x + 1)) f
214− in testUnfold unf (f :: Double) list
212+ in testUnfold unf (f :: Double) [f..(t :: Double)]
213+#endif
215214
216215enumerateFromStepIntegral :: Property
217216enumerateFromStepIntegral =
@@ -393,7 +392,9 @@ testGeneration =
393392 -- prop "enumerateFromIntegral" enumerateFromIntegral
394393 prop "enumerateFromStepNum" enumerateFromStepNum
395394 -- prop "numFrom" numFrom
395+#if MIN_VERSION_base(4,12,0)
396396 prop "enumerateFromToFractional" enumerateFromToFractional
397+#endif
397398
398399testTransformation :: Spec
399400testTransformation =