on master help sign in
Make enumerateFromStepNum numerically stable
a6e8e23Harendra Kumar
src/Streamly/Internal/Data/Unfold.hs+6−3
@@ -694,11 +694,14 @@ dropWhile f = dropWhileM (return . f)
694--
694--
695{-# INLINE enumerateFromStepNum #-}
695{-# INLINE enumerateFromStepNum #-}
696enumerateFromStepNum :: (Monad m, Num a) => a -> Unfold m a a
696enumerateFromStepNum :: (Monad m, Num a) => a -> Unfold m a a
697−enumerateFromStepNum stride = Unfold step return
697+enumerateFromStepNum stride = Unfold step inject
698+
698 where
699 where
699− -- XXX This is numerically unstable.
700+
701+ inject !from = return (from, 0)
702+
700 {-# INLINE_LATE step #-}
703 {-# INLINE_LATE step #-}
701− step !s = return $ (Yield $! s) $! (s + stride)
704+ step (from, !i) = return $ (Yield $! (from + i * stride)) $! (from, i + 1)
702
705
703-- | @numFrom = enumerateFromStepNum 1@
706-- | @numFrom = enumerateFromStepNum 1@
704--
707--
test/Streamly/Test/Data/Unfold.hs+5−4
@@ -203,15 +203,14 @@ enumerateFromStepNum =
203 lst = Prelude.take 10 $ List.unfoldr (\x -> Just (x, x + s)) f
203 lst = Prelude.take 10 $ List.unfoldr (\x -> Just (x, x + s)) f
204 in testUnfoldD unf f lst
204 in testUnfoldD unf f lst
205
205
206+#if MIN_VERSION_base(4,12,0)
206enumerateFromToFractional :: Property
207enumerateFromToFractional :: Property
207enumerateFromToFractional =
208enumerateFromToFractional =
208 property
209 property
209 $ \f t ->
210 $ \f t ->
210 let unf = UF.enumerateFromToFractional (t :: Double)
211 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
215
214
216enumerateFromStepIntegral :: Property
215enumerateFromStepIntegral :: Property
217enumerateFromStepIntegral =
216enumerateFromStepIntegral =
@@ -393,7 +392,9 @@ testGeneration =
393 -- prop "enumerateFromIntegral" enumerateFromIntegral
392 -- prop "enumerateFromIntegral" enumerateFromIntegral
394 prop "enumerateFromStepNum" enumerateFromStepNum
393 prop "enumerateFromStepNum" enumerateFromStepNum
395 -- prop "numFrom" numFrom
394 -- prop "numFrom" numFrom
395+#if MIN_VERSION_base(4,12,0)
396 prop "enumerateFromToFractional" enumerateFromToFractional
396 prop "enumerateFromToFractional" enumerateFromToFractional
397+#endif
397
398
398testTransformation :: Spec
399testTransformation :: Spec
399testTransformation =
400testTransformation =