From 5319f02fc40273c17875a605c40f9e900c1cedaf Mon Sep 17 00:00:00 2001 From: mauke Date: Tue, 4 Jul 2023 09:21:23 +0200 Subject: [PATCH] simplify the distribute Return case This commit shouldn't change the meaning of the code: lift (Return r) = -- by Monad instance of Stream lift (return r) = -- by laws of MonadTrans/lift return r However, the result may be more efficient. In the case where t = Stream f, we have: lift (Return r) = -- by definition of lift (Effect . fmap Return) (Return r) = -- by definition of (.) Effect (fmap Return (Return r)) = -- by definition of fmap Effect (Return (Return r)) But doing `return r` directly produces just `Return r` (without the no-op Effect wrapper). --- src/Streaming/Internal.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Streaming/Internal.hs b/src/Streaming/Internal.hs index d62325c..53ae081 100644 --- a/src/Streaming/Internal.hs +++ b/src/Streaming/Internal.hs @@ -763,7 +763,7 @@ distribute :: (Monad m, Functor f, MonadTrans t, MFunctor t, Monad (t (Stream f => Stream f (t m) r -> t (Stream f m) r distribute = loop where loop stream = case stream of - Return r -> lift (Return r) + Return r -> return r Effect tmstr -> hoist lift tmstr >>= loop Step fstr -> join (lift (Step (fmap (Return . loop) fstr))) {-# INLINABLE distribute #-}